"父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。"这句话能不能用更容易理解的方式说明下?
1、请宋老师给个参考答案吧,也方便我们对照,从对照中发出自己的不足。像这章“信号”,怎么调试,也不会。 观点请宋老师参考。 2、练习答案(运行通过)。 #include <string.h> #include <stdlib.h> #include <signal.h> #include <errno.h> #include <stdio.h> #include <unistd.h> void sig_handler_chld(int signo) { int child_proc_exit_status; printf("\nduring handling signal(%d).......\n", signo); printf("SIGCHLD is: \t%d\n", SIGCHLD); wait(&child_proc_exit_status); printf("child's exit status: %d\n", child_proc_exit_status); } int main() { pid_t pid; /*register SIGCHLD or parent process*/ struct sigaction sa_chld, sa_old; sa_chld.sa_handler = sig_handler_chld; sigemptyset(&sa_chld.sa_mask); sa_chld.sa_flags = 0; pid = fork(); sigaction(SIGCHLD, &sa_chld, NULL); if (pid < 0) { printf("error: %d - %s\n", errno, strerror(errno)); } else if (pid ==0) { printf("-----in child process----------\n"); printf("parent pid = %d\n", getppid()); printf("child pid = %d\n", getpid()); sleep(10); printf("-----exit(2) child process-----\n"); exit(2); } else { int i = 0; while (1) { sleep(1); printf("%d\n", i++); } } return 0; }
“系统默认的忽略动作和用户用sigaction函数自定义的忽略通常是没有区别的”,这应该是有区别的吧。没有区别怎么不会产生僵尸进程呢?
#include <sys/wait.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> void mywait(int signo) { int status; wait(&status); if(WIFEXITED(status)) printf("wait %d\n",WEXITSTATUS(status)); } int main(void) { pid_t pid; pid=fork(); if(pid==0){ int i; for(i=0;i<10000;i++); printf("0k\n"); sleep(5); exit(2); }else if(pid>0){ struct sigaction newact,oldact; sigset_t newmask,oldmask,susmask; newact.sa_handler=mywait; sigemptyset(&newact.sa_mask); newact.sa_flags=0; sigaction(SIGCHLD,&newact,&oldact); sigemptyset(&newmask); sigaddset(&newmask,SIGCHLD); sigprocmask(SIG_BLOCK,&newmask,&oldmask); susmask=oldmask; sigdelset(&susmask,SIGCHLD); sigsuspend(&susmask); sigaction(SIGCHLD,&oldact,NULL); sigprocmask(SIG_SETMASK,&oldmask,NULL); } return 0; }
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h> #include <stdio.h> void sig_child(int signo) { int status; pid_t pid; pid=wait(&status); printf("child process[%d] 's exist code is %d \n",(int)pid,WEXITSTATUS(status)); } int main(void) { struct sigaction newact, oldact; sigset_t newmask, oldmask, suspmask; pid_t pid; newact.sa_handler = sig_child; sigemptyset(&newact.sa_mask); newact.sa_flags = 0; sigaction(SIGCHLD, &newact, &oldact); sigemptyset(&newmask); sigaddset(&newmask,SIGCHLD); sigprocmask(SIG_BLOCK, &newmask, &oldmask); suspmask = oldmask; sigdelset(&suspmask, SIGCHLD); pid = fork(); if (pid < 0) { perror("fork failed"); exit(1); } else if (pid == 0) { int i; for (i = 10; i > 0; i--) { printf("This is the child, %d\n",i); sleep(1); } exit(2); } else { printf("the parent process begin to suspend!\n"); sigsuspend(&suspmask); printf("the parent process reveive the child signal and exit the suspend status now !\n"); sigaction(SIGCHLD, &oldact, NULL); sigprocmask(SIG_SETMASK, &oldmask, NULL); return 0; } }
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!