|
示例代码:
void str_cli(FILE *fp, int sockfd)
{
pid_t pid;
char sendline[MAXLINE], recvline[MAXLINE];
if ((pid = fork()) == 0) {
while (readline(sockfd, recvline, MAXLINE) > 0)
fputs(recvline, stdout);
kill(getpid(), SIGTERM); //A
exit(0);
}
while(fgets(sendline, MAXLINE, fp) != NULL)
write(sockfd, sendline, strlen(sendline));
shutdown(sockfd, SHUT_WR);
pause();
return ;
}
问题描述:上述为客户端程序,如果父进程在子进程之前意外死亡,而子进程随后从套接字读到了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 |
|
|