This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: crash if fork(2) from another thread
- From: VÃclav Haisman <v dot haisman at sh dot cvut dot cz>
- To: cygwin at cygwin dot com
- Date: Sun, 28 Sep 2008 09:32:39 +0200
- Subject: Re: crash if fork(2) from another thread
- References: <003301c92110$336cee20$0200a8c0@whiterabc2znlh>
- Reply-to: cygwin at cygwin dot com
-----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 <stdio.h>
> #include <stdlib.h>
> #include <pthread.h>
> #include <assert.h>
>
> 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().
> }
>
> return args;
> }
>
> int main()
> {
> int ret;
> pthread_t thread;
>
> ret = pthread_create(&thread, NULL, thread_func, NULL);
> assert(ret == 0);
>
> ret = pthread_join(thread, NULL);
> assert(ret == 0);
> }
>
> // built with "gcc main.c -o main.exe"
>
> Thank you.
- --
VH
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
iFYEAREIAAYFAkjfMxcACgkQhQBMvHf/WHkrOgDgjwH6nF9WnksWQtjZDKOutx2d
Sk/irkVq2NjjzADeJOjUN3LB+WkRPYGHGubEVHVT7H5DEh2NcZtPyg==
=/9e7
-----END PGP SIGNATURE-----
--
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/