我试图让我的 server.c 程序能够处理僵尸进程。最初,我signal(SIGCHLD,SIG_IGN);
从linuxhowtos.org/C_C++/socket找到了这一行。这就像一个魅力。我可以与客户端连接,然后关闭客户端,一切仍然运行顺利。
但是,我正在尝试用文章中所写的 SigCatcher 替换 SIG_IGN,并且当客户端关闭时,我的服务器程序开始出现问题(它无限地继续接收“2”并输出它)。
我都试过了wait3(NULL,WNOHANG,NULL)
,wait(-1)
但这些都没有解决问题。我到底应该在这里做什么?
void *SignalCatcher(int n)
{
wait3(NULL,WNOHANG,NULL);
}
这是我的主要外观:
//signal(SIGCHLD, SIG_IGN);
signal(SIGCHLD, SignalCatcher);
for(;;)
{
clilen=sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
if ((childpid = fork()) == 0)
{
close (listenfd);
for(;;)
{
n = recvfrom(connfd,mesg,1000,0,(struct sockaddr*)&cliaddr,&clilen);
write(connfd , "" , 1);
mesg[n] = 0;
printf("Received the following:\n");
printf("%s",mesg);
}
}
close(connfd);
}