📄 p8-20.c
字号:
#include <stdio.h>#include <sys/types.h>#include <sys/siginfo.h>#include <sys/signal.h>volatile pid_t pkid;/* SIGHCLD信号句柄.注意:技术上不支持信号句柄内调用printf,此处仅用于举例目的.*/void sigchld_handler(int sig, siginfo_t *sip, void *extra){ pid_t kid; kid = sip->si_pid; if (sip->si_code <= 0){ /* 子进程收到由其它进程发送的信号 */ printf("KILLED BY %d: Got signal %d, si_code %d for kid %d\n", sip->si_pid, sip->si_signo, sip->si_code,getpid()); exit(0); /* 收到信号后正常终止,这将导致父进程进入该句柄 */ } /* 父进程执行的代码 */ else if (sip->si_code == CLD_EXITED) printf("EXIT: Got signal %d, si_code %d for kid %d\n", sip->si_signo, sip->si_code, kid); else if (sip->si_code == CLD_DUMPED) printf("ABORT: Got signal %d, si_code %d for kid %d\n", sip->si_signo, sip->si_code, kid); else if (sip->si_code == CLD_KILLED) printf("KILLED: Got signal %d, si_code %d for kid %d\n", sip->si_signo, sip->si_code, kid); kid = wait(0); printf("Parent got PID %d exiting\n\n", kid); pkid = 0; /* 设置信号处理完毕标志 */}int main(void){ struct sigaction sa; /* 设置SIGHCLD句柄 */ sa.sa_sigaction = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; if (sigaction(SIGCHLD, &sa, 0)) { perror("sigaction"); exit(1); } printf("I am father,My pid=%d\n",getpid()); /* 创建一个子进程,该子进程先被kill然后从句柄内正常终止.*/ if (pkid = fork()){ printf("Parent forked %d\n", pkid); printf("Parent will kill %d\n", pkid); kill(pkid,SIGCHLD); } else { /* 第一个子进程 */ printf("Kid %d will be killed.\n", getpid()); while(1); /* 等待信号后终止 */ } /* 父进程:忙等待直到子进程退出. */ while (pkid); /* 创建一个子进程,该子进程将由于SIGABRT而死去 */ if (pkid = fork()) printf("Parent forked %d\n", pkid); else { /* 第二个子进程 */ sleep(1); printf("Kid %d will now die with core file.\n",getpid()); abort(); } /* 父进程:忙等待直到子进程退出. */ while(pkid); printf("Parent: done\n" );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -