我有一个僵尸进程的问题。当我从客户端关闭连接时,僵尸小孩不会死。如果我关闭了服务器端的连接,一切正常。没有僵尸孩子。我正在使用下面的代码在Linux中杀死僵尸进程
任何帮助?
#define SERV_PORT 1051
#define LISTENQ 1024
void sig_chld(int signo)
{
pid_t pid;
int stat;
while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid);
return;
}
void *pThread_TCP(void *ptr)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
void sig_chld(int);
unsigned char pData[255];
unsigned short n;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
struct ifreq ifr;
memset(&ifr, 0, sizeof(struct ifreq));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "usb0");
ioctl(listenfd, SIOCGIFINDEX, &ifr);
setsockopt(listenfd, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr, sizeof(ifr));
bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
signal(SIGCHLD, sig_chld); /* must call waitpid() */
for (; ;) {
clilen = sizeof(cliaddr);
if ((connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen)) < 0)
{
if (errno == EINTR)
continue; /* back to for() */
}
if ((childpid = fork()) == 0)
{ /* child process */
while(1)
{
n = recvfrom(connfd,pData,100,0,(struct sockaddr *)&cliaddr,&clilen);
if(n>0)
{
if(pData[0] == '^') break;
sendto(connfd,"OK\r\n",4,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
}
}
close(listenfd); /* close listening socket */
exit(0);
}
close(connfd); /* parent closes connected socket */
}
}
你能提供任何代码示例吗? – voyvoda
@voyvoda,补充!这是家庭任务吗?如果是这样,我认为现在足够包含评论,你必须弄清楚它,并阅读手册页以获取有关'waitpid(2)'系统调用的第二个和第三个参数的信息。 –
如果您使用线程来管理传入连接套接字,为什么要创建一个处理连接的整个流程?为什么不创建一个新线程来处理连接和共享主数据存储器?你有没有想过以这种方式解决问题。线程和进程意味着非常不同的东西,所以把它们混合到一个项目中几乎总是糟糕的设计。使用线程或进程,但不能同时使用......更多的是,如果你不想使用'exec()'来跟踪'fork()'来产生一个不同的程序。 –