int main(int argc, char const *argv[]) { int status; pid_t child_pid; switch(fork()) { case -1: printf("创建子进程失败\n"); exit(EXIT_FAILURE); case 0: // 子进程 printf("子进程开始运行, PID:%ld\n", (long)getpid()); if(argc > 1) exit(atoi(argv[1])); else { for(;;) pause(); } exit(EXIT_FAILURE); default: /** * 检测子进程的状态 * 如果子进程的状态没有发生改变,立即返回 * 子进程收到信号停止也会返回 */ for(;;) { child_pid = waitpid(-1, &status, WUNTRACED #ifdef WCONTINUED | WCONTINUED #endif ); if(child_pid == -1) { printf("waitpid调用失败\n"); exit(EXIT_FAILURE); } printf("waitpid() 返回: PID=%ld; status=0x%04x (%d, %d)\n", (long)child_pid, (unsigned int)status, status>>8, status&0xff); print_wait_status(NULL, status); if(WIFEXITED(status) || WIFSIGNALED(status)) { exit(EXIT_SUCCESS); } } } return 0; }
int main (void) { struct sigaction sa; sigset_t sigMask; pid_t chldPid; int status; // establish handler for SIGCHLD sigemptyset (&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = signal_handler; sigaction (SIGCHLD, &sa, NULL); // block SIGCHLD sigemptyset (&sigMask); sigaddset (&sigMask, SIGCHLD); sigprocmask (SIG_BLOCK, &sigMask, NULL); switch (chldPid = fork ()) { case -1: perror ("fork()"); return 1; case 0: // child _exit (0); default: // wait for child to exit sleep (2); // unblock SIGCHLD sigprocmask (SIG_UNBLOCK, &sigMask, NULL); waitpid (chldPid, &status, 0); print_wait_status (status); break; } return 0; }
static void sig_child_handler(int sig) { int status, saved_errno; pid_t child_pid; /* UNSAFE: This handler uses non-async-signal-safe functions * (printf(), print_wait_status(), curr_time()) */ saved_errno = errno; /* In case we modify 'errno' */ printf("%s handler: Caught SIGCHLD\n", curr_time("%T")); while((child_pid = waitpid(-1, &status, WNOHANG)) > 0) { printf("%s handler: Reaped child %ld - ", curr_time("%T"), (long)child_pid); print_wait_status(NULL, status); num_live_children--; } if (child_pid == -1 && errno != ECHILD) err_msg("waitpid"); printf("%s handler: return\n", curr_time("%T")); }
int main (void) { int ret; #if (DONT_HANDLE_SIGCHLD == 0) struct sigaction sa; // don't care about zombies sigemptyset (&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = SIG_IGN; sigaction (SIGCHLD, &sa, NULL); #endif ret = system ("sleep 3"); if (ret == -1) { perror ("system()"); return 1; } print_wait_status (ret); return 0; }