示例代码:
1 void str_cli(FILE *fp, int sockfd) 2 { 3 pid_t pid; 4 char sendline[MAXLINE], recvline[MAXLINE]; 5 if ((pid = fork()) == 0) { 6 while (readline(sockfd, recvline, MAXLINE) > 0) 7 fputs(recvline, stdout); 8 kill(getpid(), SIGTERM); //A 9 exit(0); 10 } 11 while(fgets(sendline, MAXLINE, fp) != NULL) 12 write(sockfd, sendline, strlen(sendline)); 13 shutdown(sockfd, SHUT_WR); 14 pause(); 15 return ; 16 }
问题描述:上述为客户端程序,如果父进程在子进程之前意外死亡,而子进程随后从套接字读到了EOF,则会存在如下问题:
由于父进程提前死亡,对于子进程而言,直接父亲进程死亡,其成为孤儿进程,在Linux内核中,这样的孤儿进程将由init进程收养。子进程读到EOF后,代码A将会执行,子进程向其父进程,即init进程发送SIGTERM信号。如果子进程具有超级用户权限,则系统将会允许其向init发送终止信号。执行结果为:
root@ubuntu:/home/test# ./signal-test
root@ubuntu:/home/test# dmesg
[20409.660653] init: Re-executing /sbin/init