X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Sun, 28 Sep 2008 11:25:27 -0400 From: Christopher Faylor To: cygwin AT cygwin DOT com Subject: Re: crash if fork(2) from another thread Message-ID: <20080928152527.GA2219@ednor.casa.cgf.cx> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <003301c92110$336cee20$0200a8c0 AT whiterabc2znlh> <48DF3317 DOT 5060300 AT sh DOT cvut DOT cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <48DF3317.5060300@sh.cvut.cz> User-Agent: Mutt/1.5.16 (2007-06-09) 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 Sun, Sep 28, 2008 at 09:32:39AM +0200, V??clav Haisman wrote: >-----BEGIN PGP SIGNED MESSAGE----- >Hash: SHA256 > >Hirokazu Yamamoto wrote, On 28.9.2008 4:16: >> # I've post mail, but it didn't show up in >> http://www.nabble.com/Cygwin-f12165.html. >> # Maybe it was not good to attach a file. So try again... >> >> I'm not familiar with pthread & fork, but I think following code should not >> crash. Is this expected behavior? >> >> #include >> #include >> #include >> #include >> >> void *thread_func(void* args) >> { >> int ret; >> pid_t pid; >> pthread_t thread; >> >> puts("thread_func"); >> >> pid = fork(); >> >> assert(pid != (pid_t)-1); >> >> if (pid != 0) /* parent process */ >> { >> int status; >> >> printf("parent process (child pid = %d)\n", pid); >> >> waitpid(pid, &status, 0); >> >> puts("parent process end"); >> } >> else /* child process */ >> { >> puts("child process"); /* crash here */ >I think this is not allowed in here. You can only do async-signal-safe >stuff in the child. IO is AFAIK not in that category. Basically, the >only thing you can safely do in the child process is to call exec(). I don't see any reason why this shouldn't be allowed. You should be able to do anything you want in a child process. cgf -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/