#include #include #include extern char *environ[]; void handler(int sig, siginfo_t *si, void *ctx __attribute__((unused))) { char buf[1024]; snprintf(buf, 1024, "signal %d process %d", sig, si->si_pid); puts(buf); } int main(void) { char *args[] = {"/bin/sleep", "2", NULL}; struct sigaction sa; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO | SA_NODEFER; sigaction(SIGCHLD, &sa, NULL); if (fork() == 0) { execve(args[0], args, environ); } if (fork() == 0) { execve(args[0], args, environ); } if (vfork() == 0) { struct timespec ts = {4, 0}; nanosleep(&ts, NULL); _exit(0); } while (1) pause(); }