On Wed, Nov 19, 2008 at 12:16:32PM -0500, Jonathan Steel wrote:
> Hi
>
> In the SIGCHLD signal handler of parent process, I need to get the pid
> of the child when the child dies. To do this I'm using sigaction with
> the SA_SIGINFO flag. But the siginfo_t->si_pid member does not seem to
> be set.
>
> I found the following post from Otto that seems to say that what I'm
> trying to do may not work on OpenBSD.
>
> http://www.archivum.info/fa.openbsd.tech/2008-02/msg00124.html
>
> Ive tried the following code on linux and everything works great, but on
> OpenBSD it doesn't work. I've tried it on 3.8 and 4.2, and I'm currently
> downloading 4.4 to see if it works on there.
>
> #include <signal.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <unistd.h>
> #include <string.h>
> #include <errno.h>
>
>
> void signalChild(
> int signal, siginfo_t* info, void* notUsed
> ){
> printf("Entering signal handler!\n");
> if ( info == NULL )
> {
> printf("siginfo is NULL...aborting!\n");
> exit(1);
> }
> printf("Handling signal %d at %p\n", signal, info->si_addr);
> printf("PID: %d\t \n", info->si_pid);
> printf("Signal code: %d\n", info->si_code );
> }
>
>
> int main()
> {
> struct sigaction child;
> sigemptyset ( &child.sa_mask );
> child.sa_sigaction = &signalChild;
> child.sa_flags = 0;
> child.sa_flags |= SA_SIGINFO;
> child.sa_flags &= ~SA_NOCLDSTOP;
>
> if ( sigaction( SIGCHLD, &child, NULL ) == -1 )
> {
> fprintf( stderr, "Error with signal setup. Errno: %i\n", errno );
> exit( 1 );
> }
>
> int pid = fork();
>
> if ( pid == 0 )
> {
> fprintf( stderr, "PID: %i\n", getpid() );
> exit(0);
> }
>
> sleep( 1 );
> exit(0);
> }
>
>
> Does anybody know how I'm to accomplish this, or why it doesn't work?
This is probably a bug, as I said in the post you mentioned. Just use
wait(2), there are plenty of examples in the tree that use wait in a
SIGCHLD handler.
-Otto