【问题标题】:Creating Zombie process in C (Linux) [duplicate]在C(Linux)中创建僵尸进程[重复]
【发布时间】:2021-12-09 23:41:11
【问题描述】:

我的任务是创建僵尸进程。我的代码如下所示:

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <sys/types.h>  
#include <sys/wait.h>  

int main() {  
    pid_t pid = fork();  

    if (pid == -1) {  
        printf("error\n");  
    }  
    else if (pid == 0) {  
        printf("Child %d\n", getpid());  
        printf("Parents %d\n", getppid());  
        printf("Waiting for my Child to complete\n");  
        exit(0);  
    }  
    else {  
        sleep(5);  
        printf("Parent %d\n",getpid());  
    }  

    return 0;  
}  

当我gcc 并使用./a.out 执行文件时,我得到以下输出:

儿童 25097
家长25096
等待我的孩子完成
父级 25096(几秒钟后)

我的任务是创建一个僵尸进程并在父进程中打印出子进程的退出状态。一切都让我感到困惑,因为这是我第一次使用 Linux 和 C。

您对我有一些提示/提示,如何解决任务?因为我不确定一切是否正确。我也尝试过使用wait()waitpid()WEXITSSTATUS(),但我不确定。我使用ps x 命令检查是否有不同的输出,但我没有注意到任何变化。

提前致谢:)

【问题讨论】:

  • 我不确定最后一个 if{} 会发生什么。你能给我解释一下吗?

标签: c linux process command zombie-process


【解决方案1】:

这段代码将成功创建一个僵尸进程。

调用fork 后,子进程打印几行并退出,而父进程休眠 5 秒。这意味着当父进程处于睡眠状态时,您将有大约 5 秒的僵尸进程。

睡眠完成后,父级打印一些内容并退出。一旦父进程退出,子进程将被 init 进程继承,该进程将为子进程 wait 并使其 pid 从 pid 列表中消失。

您也可以在父进程中使用wait,在这种情况下,子进程是僵尸,直到父进程调用wait

【讨论】:

  • 有没有办法让子进程在父进程睡眠结束后永久退出?
  • @Marco 不确定你的意思。一旦调用exit,孩子就会“永久”退出。然后它会一直保持僵尸状态,直到它的父级退出或调用 wait
  • 好的,现在知道了。以及如何打印出子进程的退出状态?在父进程中?
  • @Marco 你是从wait 那里得到的。检查文档。
  • 好的,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多