[REQUEST] Need help catching SIGCHLD
Marc Ries
ries at venice.SEDD.TRW.COM
Thu May 2 07:06:27 AEST 1991
Could some kind soul clue me in to either the right way to do the
following or tell me what I'm doing wrong? Thanks Marc ries at venice.sedd.trw.com
Basically, I am just tring to learn how to do a fork and exec
a child process, return to the main (which is free to do other
things in the meantime) and let the main be notified when
the child dies.
The following quickie test code doesn't work:
("childprog" is something simple like: main(){sleep(15);return;})
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#define CHILD 0
int pid;
main()
{
extern void exec_child();
exec_child();
sleep(60);
return (0);
}
void
exec_child()
{
char *program = "childprog\0";
int catch_sigchld();
static int first_time;
if (first_time) {
(void) signal(SIGCHLD, catch_sigchld);
first_time = 1;
}
pid = vfork();
if (pid < CHILD) {
/* error */
(void) printf("Unable to fork\n");
(void) exit(-1);
} else if (pid > CHILD) { /* parent process */
(void) printf("\t\t\tI'm the PARENT. My child is [#%d]\n", pid);
} else {
/* child process */
(void) execl(program, program);
}
return;
}
wait3_handler(lpid)
int lpid;
{
int catch_sigchld();
(void) signal(SIGCHLD, catch_sigchld);
/*
* do something with pid
*/
(void) printf("Do something with PID #%d\n", lpid);
return (0);
}
catch_sigchld()
{
int lpid, status = 0;
long oldmask;
while ((lpid = wait3(&status, WNOHANG, NULL)) > 0) {
(void) wait3_handler(lpid);
oldmask = sigblock(sigmask(SIGCHLD));
(void) sigsetmask(oldmask);
}
}
More information about the Comp.lang.c
mailing list