gpt4 book ai didi

c - 你如何使用 wait() 杀死僵尸进程

转载 作者:IT王子 更新时间:2023-10-29 00:57:38 25 4
gpt4 key购买 nike

我有这段代码,要求 parent fork 3 个 child 。

  • 你怎么知道(和)在哪里放置要终止的“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?

如果您的 parent 只产生少量固定数量的 child ;不关心他们何时或是否停止、继续或完成; 本身退出很快,那么就不需要使用wait()waitpid()来清理子进程了。 init 进程 (pid 1) 负责孤立的子进程,并在它们完成时清理它们。

然而,在任何其他情况下,您必须为子进程wait()。这样做可以释放资源,确保 child 已经完成,并允许您获得 child 的退出状态。通过 waitpid(),如果您愿意,您还可以在 child 停止或恢复信号时收到通知。

至于在哪里执行等待,

  • 您必须确保只有父级 wait()
  • 您应该在您需要 child 完成的最早时间点或之前等待(但不要在 fork 之前),或者
  • 如果你不关心 child 何时或是否完成,但你需要清理资源,那么你可以定期调用waitpid(-1, NULL, WNOHANG)来收集一个僵尸 child 如果有,如果没有则不阻塞。

特别是,您必须wait()(无条件地)在fork()ing 之后,因为父子进程运行相同的代码.您必须使用 fork() 的返回值来确定您是在子项中(返回值 == 0),还是在父项中(任何其他返回值)。此外,仅当 fork 成功时,父级才必须 wait(),在这种情况下,fork() 返回子级的 pid,该 pid 始终大于零。返回值小于零表示 fork 失败。

您的程序实际上并不需要 wait(),因为它刚好生成四个(而不是三个)子级,然后退出。但是,如果您希望 parent 在任何时候最多有一个活着的 child ,那么您可以这样写:

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 命令获取僵尸进程列表。您还可以通过 top 查看僵尸。然而,使用您的原始代码,您不太可能瞥见僵尸,因为父进程退出非常快,然后 init 将清理它留下的僵尸。

关于c - 你如何使用 wait() 杀死僵尸进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com