系统相关
首页 > 系统相关> > 你怎么用wait()杀死僵尸进程

你怎么用wait()杀死僵尸进程

作者:互联网

我有这个代码,需要父母分叉3个孩子.

>你怎么知道(和)将“wait()”语句放在哪里杀死
僵尸进程?
>如果你有Linux,那么查看僵尸进程的命令是什么?
虚拟盒子?

main(){

 pid_t child;
 printf("-----------------------------------\n");
 about("Parent");
 printf("Now ..  Forking !!\n");
 child = fork();
 int i=0;

 for (i=0; i<3; i++){
    if (child < 0) {
        perror ("Unable to fork");
        break;
    } 
    else if (child == 0){
        printf ("creating child #%d\n", (i+1));
        about ("Child");
        break;
    }

    else{
        child = fork();
    }
  } 
}       

void about(char * msg){

 pid_t me;
 pid_t oldone;

 me = getpid();
 oldone = getppid();

 printf("***[%s] PID = %d   PPID = %d.\n", msg, me, oldone);

}

解决方法:

How do you know (and) where to put the “wait()” statement to kill
zombie processes?

如果你的父母只产生一小部分固定数量的孩子;不关心他们何时或是否停止,恢复或完成;并且它本身很快退出,那么你不需要使用wait()或waitpid()来清理子进程. init进程(pid 1)负责处理孤立的子进程,并在完成后对其进行清理.

但是,在任何其他情况下,您必须wait()进行子进程.这样做可以释放资源,确保孩子已经完成,并允许您获得孩子的退出状态.通过waitpid(),如果您愿意,也可以在孩子被信号停止或恢复时通知您.

至于在哪里进行等待,

>您必须确保只有父wait()s.
>您应该在您需要孩子完成(但不是在分叉之前)的最早点或之前等待,或者
>如果您不关心孩子何时或是否完成,但您需要清理资源,那么您可以定期调用waitpid(-1,NULL,WNOHANG)来收集一个僵尸孩子(如果有的话),如果有的话没有阻止不是.

特别是,你不能在fork()之后立即wait()(无条件地),因为父和子运行相同的代码.必须使用fork()的返回值来确定您是在子级(返回值== 0)还是在父级(任何其他返回值)中.此外,父级必须wait()只有在分叉成功的情况下,在这种情况下fork()返回子级的pid,它总是大于零.返回值小于零表示无法fork.

你的程序实际上不需要wait()因为它会产生四个(而不是三个)孩子,然后退出.但是,如果您希望父母在任何时候最多只有一个活孩子,那么您可以这样写:

int main() {
    pid_t child;
    int i;

    printf("-----------------------------------\n");
    about("Parent");

    for (i = 0; i < 3; i++) {
        printf("Now ..  Forking !!\n");
        child = fork();

        if (child < 0) {
            perror ("Unable to fork");
            break;
        } else if (child == 0) {
            printf ("In child #%d\n", (i+1));
            about ("Child");
            break;
        } else {
            /* in parent */
            if (waitpid(child, NULL, 0) < 0) {
                perror("Failed to collect child process");
                break;
            }
        }
    }

    return 0;
}

如果父节点在其一个或多个子节点之前退出,如果它不等待就会发生,那么子节点此后将看到其父进程为pid 1.

其他人已经回答了如何通过ps命令获取僵尸进程列表.您也可以通过顶部看到僵尸.使用原始代码,你不太可能看到僵尸的一瞥,因为父进程很快退出,然后init将清理它留下的僵尸.

标签:c-3,linux,virtualbox,wait,zombie-process
来源: https://codeday.me/bug/20190725/1528682.html