客户端父进程提前死亡

示例代码:

 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

原文地址:https://www.cnblogs.com/scu-cjx/p/7728867.html