【问题标题】:Can't create zombie process无法创建僵尸进程
【发布时间】:2016-12-13 13:11:54
【问题描述】:

我正在尝试使用以下方法在 C 中创建一个僵尸进程:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>

void main()
{
        int pid;
        pid=fork(); /* Duplicate */
        if (pid!=0) /* Branch based on return value from fork() */
        {
                while (1) /* never terminate, and never execute a wait()*/
                sleep(1000);
        }
        else
        {
                exit(42); /* Exit with a silly number */
        }
}

问题是我只知道如何检查僵尸进程是否只存在于 bash 中。所以我使用了 Windows 10 中可用的 Bash on windows 功能。我为上述代码创建了一个可执行文件并在后台运行它并检查了一个僵尸进程但找不到它。我在一台运行 Ubuntu 的 PC 上重复了相同的步骤,并且成功了。我做错了什么?

【问题讨论】:

  • Windows 不是 UNIX。
  • 您真正想要完成什么?
  • @IInspectable 这只是大学时给我们的作业。创建一个僵尸进程。我在运行 Ubuntu 的大学计算机实验室中成功地做到了这一点。但不明白为什么我在 Windows 上的 Bash 没有得到相同的结果
  • 适用于 Linux 的 Windows 子系统是一个测试版。即使是 RTM,您也应该预料到行为会有所不同。

标签: c windows process zombie-process


【解决方案1】:

Windows 没有僵尸进程。

僵尸是 Unix 进程模型的一个特性——当一个进程退出(在 UNIX 中)时,它的退出状态不会发送到任何地方。相反,它只是坐在那里,直到其他一些进程查询退出状态。僵尸进程状态允许这样做——在进程退出后,它仍然是僵尸,直到有人(任何人)查询它的退出状态。

另一方面,在 Windows 上,当使用 CreateProcess 创建进程时,您指定退出状态信息应在其退出时发送到何处(通常返回其父级,但可能在其他地方)。因此,当一个进程退出时,数据会立即发送到那里,而无需任何地方的干预。没有其他进程可以查询退出状态。

如果您在 Windows 上使用 UNIX 仿真器(例如 cygwin),那么您可能会遇到某种形式的僵尸——通常,仿真器将有一个数据结构在某处跟踪额外的 UNIX 风格的进程信息,并且该数据结构将可能包含一个保存退出状态的地方,可以在进程退出后对其进行查询,就像僵尸一样。

【讨论】:

  • 注意只有父进程才能获得僵尸状态。有一个特殊的规则,如果一个僵尸的父进程没有等待僵尸就死了,那么一个特殊的系统进程会继承这个僵尸。特殊进程在生命中的主要目的是等待进程死亡——杀死邪恶的僵尸。
  • Bash on Windows 是一个 Unix 模拟器。我从未见过它运行,但从我所读到的,它足以运行 Ubuntu,这应该意味着它足够准确,可以模拟僵尸进程。
  • @Gilles:它不是模拟器。这是一个实现。
  • 这个答案完全是假的。对CreateProcess 的调用完全符合函数名称的含义。它创建一个进程并向调用者返回一个句柄。只要进程对象有打开的句柄,就可以查询它的退出代码。任何持有进程句柄的人都可以查询退出代码。它不必是CreateProcess 的调用者。我假设你有尊严删除这个甚至不是另一个问题的答案。
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2021-02-20
  • 2013-11-18
相关资源
最近更新 更多