server.cプログラムがゾンビプロセスを処理できるようにしようとしています。もともと、私はlinuxhowtos.org/C_C++/socketsignal(SIGCHLD,SIG_IGN);
からその行を見つけました。これは魅力のように機能します。クライアントに接続してからクライアントを閉じることができますが、それでもすべてがスムーズに実行されます。
しかし、記事に書かれているようにSIG_IGNをSigCatcherに置き換えようとしていますが、クライアントが閉じられるとサーバープログラムが停止し始めます(「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);
}