X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Mon, 16 Aug 2010 11:05:52 +0200 From: Corinna Vinschen To: cygwin AT cygwin DOT com Subject: Re: Bug in fork() while in a thread Message-ID: <20100816090552.GA11340@calimero.vinschen.de> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <20100815185353 DOT GA26993 AT ednor DOT casa DOT cgf DOT cx> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20100815185353.GA26993@ednor.casa.cgf.cx> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Aug 15 14:53, Christopher Faylor wrote: > On Sun, Aug 15, 2010 at 07:42:01PM +0200, Jason Curl wrote: > >Is it allowed to issue the fork() system call while not in the main > >thread? When I read the OpenGroup specifications I don't seem to find > >anything against allowing this. > > > >In particular, if I create a thread, then issue a fork(), data that > >exists on the stack is corrupted after the fork() is in the child. Using > >data on the heap doesn't show any issues (and is currently my > >workaround, in case this is a bug). > > If I'm reading this correctly then "the stack" in this case is the stack > associated with the main thread. Cygwin only duplicates the stack in > the executing thread. In your example, env (or presumably env2) from > the main thread is passed to another thread which then calls fork. In > that scenario, the forked process is going to see garbage in env since > the array has never been initialized. > > It is theoretically possible to duplicate the stack of the main thread > and other threads in the forked process [...] I guess I'm missing something here. Here's an excerpt from the SUSv4 fork man page: The fork() function shall create a new process. The new process (child process) shall be an exact copy of the calling process (parent process) except as detailed below: [...] o A process shall be created with a single thread. If a multi-threaded process calls fork(), the new process shall contain a replica of the calling thread and its entire address space, possibly including the states of mutexes and other resources. [...] Is the stack of another thread, which is not executed in the forked process anymore, a part of the calling's thread "entire address space"? Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple