Here's the results I got with your test program on Solaris 8, OSF1, HP-UX, AIX.

Ludovic.

Results on Solaris 8:

bondi> sigtest
installing signal handler...
forking...
waiting for child 9253 to exit...
child 9253 has exited
  sig_pid = 9253
  sig_status = 25600
  main_pid = -1
  main_status = 9999
sigchld handler was called before waitpid (no status)
bondi>

Results on OSF1- V4.0 True64 - alpha

centauri> sigtest
installing signal handler...
forking...
waiting for child 26517 to exit...
child 26517 has exited
  sig_pid = 26517
  sig_status = 25600
  main_pid = -1
  main_status = 9999
sigchld handler was called before waitpid (no status)

Results on HP-UX B.11.00 E 9000/715

gorzon> sigtest
installing signal handler...
forking...
waiting for child 26769 to exit...
child 26769 has exited
  sig_pid = 26769
  sig_status = 25600
  main_pid = -1
  main_status = 9999
sigchld handler was called before waitpid (no status)

Results on AIX 3.4

aladin> sigtest
installing signal handler...
forking...
waiting for child 15236 to exit...
child 15236 has exited
  sig_pid = 15236
  sig_status = 25600
  main_pid = -1
  main_status = 9999
sigchld handler was called before waitpid (no status)
aladin>

Raphael Quinet wrote:

> Included below is a small test program that checks how the OS behaves
> when a child process exits while the parent is blocking on waitpid()
> and has a SIGCHLD handler installed (which also calls waitpid, and
> thus could steal the status if the signal handler is called before
> the first waitpid returns).
>
> Currently, I only tested this under Linux (2.2.13, 2.2.14), Solaris
> 2.6 and IRIX 6.5.  Linux and IRIX give priority to waitpid(), Solaris
> gives priority to the signal handler.  That's why several plug-ins did
> not work under Solaris.
>
> If you are running another UNIX-like system (*BSD, HP-UX, AIX, etc.),
> it would be nice if you could compile and run the following code and
> report what it says.  The code does not depend on glib, gtk or any
> other libraries, so it should be easy to compile it on any system.
>
> -Raphael
>
> #include <signal.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <unistd.h>
>
> int pid;
> int sig_pid = 9999;
> int sig_status = 9999;
> int main_pid = 9999;
> int main_status = 9999;
>
> static void
> sigchld_handler (int signum)
> {
>   sig_pid = waitpid (pid, &sig_status, WNOHANG);
> }
>
> int
> main (int argc, char *argv[])
> {
>   int ret;
>   struct sigaction sa;
>   struct sigaction osa;
>
>   printf ("installing signal handler...\n");
>   sa.sa_handler = sigchld_handler;
>   sigfillset (&sa.sa_mask);
>   sa.sa_flags = SA_RESTART;
>   ret = sigaction (SIGCHLD, &sa, &osa);
>   if (ret < 0)
>     {
>       printf ("cannot set signal handler, bye!\n");
>       exit (-1);
>     }
>
>   printf ("forking...\n");
>   pid = fork ();
>   if (pid == 0)
>     {
>       sleep (1);
>       _exit (100);
>     }
>
>   printf ("waiting for child %d to exit...\n", pid);
>   main_pid = waitpid (pid, &main_status, 0);
>
>   printf ("child %d has exited\n", pid);
>   printf ("  sig_pid = %d\n", sig_pid);
>   printf ("  sig_status = %d\n", sig_status);
>   printf ("  main_pid = %d\n", main_pid);
>   printf ("  main_status = %d\n", main_status);
>   if (sig_pid < 0)
>     {
>       if (main_pid < 0)
>         printf ("no child status (fork failed?)\n");
>       else
>         printf ("waitpid got the status before sigchld handler was called\n");
>     }
>   else
>     {
>       if (main_pid < 0)
>         printf ("sigchld handler was called before waitpid (no status)\n");
>       else
>         printf ("you seem to have a very interesting OS...\n");
>     }
> }

--
Ludovic Poitou
Sun Microsystems Inc.
iPlanet E-Commerce Solutions - Directory Group - Grenoble - France



Reply via email to