我怎么能避免僵尸进程

时间:2018-01-29 21:26:15

标签: linux sockets

我有这段代码:

服务器

    while(1){ //while after connect 
    printf(inet_ntoa(serv_addr.sin_addr));
printf(" :>");
    bzero(buffer, 256);


printf("pid: %d",&getpid);
    //fgets(buffer,255,stdin);

scanf("%s",&buffer[0]); 
 if ( send(sockfd, buffer, strlen(buffer),0)< 0)
         error("ERROR writing to socket");

if(strcmp(buffer,"quit") == 0){
    close(sockfd);
    printf("Client: %s Disconnect \n",inet_ntoa(serv_addr.sin_addr));
    gepid[0]=getpid();  //there is the error i want to get the pid of child 
    send(sockfd,gepid,10,0); //and send to server
    exit(1);
    }   



if (recv(sockfd, buffer, 255,0)< 0){
    error("ERROR reading from socket");
}else{
printf("%s\n %d", buffer,n);
 }  
}  

  return 0;
}

客户端

 Column | Type
 id       integer
 value    varchar(255)

我有一个服务器,可以服务于多个客户端并响应每个客户端写入退出或停止信号[CTR-C]我希望服务器得到它并避免僵尸进程,以避免僵尸进程我想  从客户端向服务器发送getpid,以便当进程完成退出或通过信号父进程停止时,客户端获取进程的pid得到waitpaid的退出 所以该程序没有僵尸进程我不知道这个逻辑是否有利于停止僵尸进程,但我尝试从客户端发送pid到服务器,我得到分段错误

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

您的代码存在许多问题,但要专注于您的问题:

请勿尝试将pid发送到服务器。这是不必要的,如果孩子在发送它之前崩溃,它就不会起作用。

通常的方法是捕获SIGCHLD信号,并从信号处理程序内部执行任何必要的waitpid内容。但是,如果您的关注的是避免使用僵尸,那么只需使用signal(SIGCHLD, SIG_IGN);安装默认信号处理程序,并且根本不使用waitpid

答案 1 :(得分:0)

fork() returns 0 in the child and the child pid in the parent,因此无需将pid从子节点发送到父节点。如果你多次分叉,那么你需要存储每个孩子的pid以便以后收集。

您没有显示gepid的类型。它是pid_t gepid 2还是什么? len parameter to recv()以字节为单位,因此更适合recv(sock,gepid,sizeof(gepid [0]),0);

此外,如果您将-1传递给waitpid(),它会等待任何孩子。