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)
- 僵尸可以拒绝释放一些内存锁吗?
僵尸无法抓住任何东西.他们丢失了所有的内存页面,打开文件句柄等等.几乎所有操作系统都可以弄清楚如何释放应该被释放的东西.这不是一个错误,但请记住操作系统必须知道它应该被释放.在用户空间中创建资源非常容易,当程序死亡时,应该释放操作系统不知道应该被释放的资源.
僵尸进程纯粹是一个 pid 和退出状态值。无法释放 pid,因为资源(pid)“属于”父级。如果它被释放,另一个进程可能会被分配相同的 pid,然后父进程最终可能会向不相关的进程发送信号;即使父进程首先等待确定子进程是否已退出,也无法避免竞争条件。
| 归档时间: |
|
| 查看次数: |
16174 次 |
| 最近记录: |