- 论坛徽章:
- 0
|
void sigCatchChld(int sig)
{
int status;
pid_t pid;
while ((pid = waitpid(-1, &status, WNOHANG)) >; 0) printf("child %d terminated\n", pid);
}
int unicomServer::Run()
{
pid_t pid;
socklen_t addr_size = (int)sizeof(remote_sin);
(void)signal(SIGCHLD, sigCatchChld);
while (1)
{
conn_socket = accept(Mysocket, (struct sockaddr *)&remote_sin, &addr_size);
if (conn_socket < 0)
{
socket_error = MySOCKET_ACCEPT_ERROR;
return -1;
}
if ((pid = fork()) >; 0)
{
close(conn_socket);//父进程关闭连接描述符
continue;
}
else if (pid == 0)
{
close(Mysocket);//子进程关闭监听描述符
analyzePackage(conn_socket);
exit(0);
}
else if (pid < 0)
{
this->;setLogInfo();
gTool->;writeLog("%s%s%s\n", LOG_MAINPROCESS_PROMPT, "创建子进程失败,详细信息:", logrecord_info);
return -2;
}
}
return 0;
}
int main()
{
...................
Run();
..................
}
现在的问题是:
1)fork之后有僵死进程产生.
2)只有第一个子进程结束后父进程接收到了信号,进入了信号处理函数中,fork第2,3。。之后的子进程都不能进入信号处理函数之中,从而产生了僵死进程。
请问这是什么问题呢?如何解决? |
|