僵尸进程

Abo*_*our 13 c unix posix process systems-programming

我有一些关于僵尸进程的问题

  • 僵尸流程概念的好处是什么?
  • 知道内核为僵尸进程保留(PID,终止状态,资源使用信息)
    "资源使用信息"的含义是什么
  • 如何僵尸的PPID()= 1并且它仍然是僵尸,(init收到Zombies,因为它默认为wait())
    任何人都可以编写一些C代码来制作僵尸它的父亲是Init吗?
  • 可以僵尸拒绝释放一些内存锁?

提前致谢

nat*_*ose 13

- 僵尸流程概念的好处是什么?

僵尸进程只是一个pid,一个退出状态,以及一些会计信息,这些信息会一直存在,直到父级使用wait系统调用系列中的一个来获得其最终状态.在父母调用wait子进程ID之前,必须将其标记为已使用,以便不能为其分配任何其他进程.如果要为另一个进程分配一个回收的pid,则很难区分它与之前具有相同pid的进程之间的区别.一旦wait由父进程调用并返回最终退出状态,可以假定没有人会再次在该pid中查找子进程,因此现在可以重用pid.(我认为在Linux上,如果父母将SIGCHLD作为SIG_IGN离开,内核将不会保留僵尸,但重新注册SIGCHLD的处置为SIG_IGN不具有相同的效果)

- 知道内核为僵尸进程保存(PID,终止状态,资源使用信息)"资源使用信息"的含义是什么

其中一些信息是运行程序的原因:

time my_program
Run Code Online (Sandbox Code Playgroud)

将报告.这些值通常在SIGCHLD的siginfo结构中报告(这不是一个调用wait),但也可以通过调用systme 调用的waitid形式(在某些系统上)获得.查看man sigaction有关此结构的信息.

- 僵尸的PPID()如何= 1并且它仍然是僵尸,(init收获Zombies因为它默认等待())

一个ppid = 1的僵尸不应该长时间保持僵尸,因为init应该很快收获它.一个过程将在它死亡后不久(通过exit或通过一个无法消除它的信号)保持僵尸,直到它的父母调用wait并获得它的最终状态.这意味着即使init除了一遍又一遍地调用init之外什么都不做,因此可能会有少量时间将进程显示为僵尸.如果进程在很长一段时间(秒)内显示为init(0 = ppid)的子进程,则可能出现问题.

- 任何人都可以编写一些C代码来制作一个僵尸它的父亲是Init吗?

这不清楚,但我想你想要:

pid_t f = fork();
if (f > 0) {
    exit(0); // this is the parent dying, so the child will be an orphan
             // and get adopted by init
} else if (f == 0) {
    sleep(100); // This is the child doing something that takes enough time for
                // its parent to commit suicide (exit(0)) and then for you to
                // observe that it has now been adopted by init
    exit(0);    // And now it dyes as well, so init should reap its status, but
                // it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */
Run Code Online (Sandbox Code Playgroud)

- 僵尸可以拒绝释放一些内存锁吗?

僵尸无法抓住任何东西.他们丢失了所有的内存页面,打开文件句柄等等.几乎所有操作系统都可以弄清楚如何释放应该被释放的东西.这不是一个错误,但请记住操作系统必须知道它应该被释放.在用户空间中创建资源非常容易,当程序死亡时,应该释放操作系统不知道应该被释放的资源.

  • @Aboelnour:内核中有一个或多个错误,或者运行的系统上有_init_,由于某种原因_init_已经死亡(我不知道如果_init_死亡会发生什么),root发送`SIGSTP`到_init_,或_init_运行得非常慢.这不应该发生. (3认同)

R..*_*R.. 5

僵尸进程纯粹是一个 pid 和退出状态值。无法释放 pid,因为资源(pid)“属于”父级。如果它被释放,另一个进程可能会被分配相同的 pid,然后父进程最终可能会向不相关的进程发送信号;即使父进程首先等待确定子进程是否已退出,也无法避免竞争条件。

  • 已退出但其父进程尚未通过“waitpid”或类似接口获得退出状态通知的子进程。 (2认同)