心中已经对僵尸的一些问题处理僵尸进程
- 从什么僵尸进程概念的好处是什么?
- 知道内核维护(PID,终止状态,资源使用信息)僵尸进程
什么的“资源使用信息” - 如何僵尸的PPID()= 1,它仍然僵尸的意思,(INIT收获僵尸,因为它等待()默认)
可以任何一个写一些C代码作出僵尸它的父母是初始? - 僵尸可以拒绝释放内存锁吗?
由于事先
心中已经对僵尸的一些问题处理僵尸进程
由于事先
- 僵尸过程概念有什么好处?
僵尸进程只是一个pid,退出状态和一些会计信息,直到父母使用wait
系列调用系列之一才能获得其最终状态。在父母呼叫wait
之前,孩子的进程ID必须保持标记为已使用状态,以便不能为其分配任何其他进程。如果另一个进程被分配了一个回收的pid,那么很难区分它和以前具有相同pid的进程之间的区别。一旦父母调用wait
并返回最终退出状态,可以假定没有人会再次在该pid处查找孩子,所以现在可以重新使用该pid。 (我想在Linux上,如果父母离开SIGCHLD为SIG_IGN内核将不会保持周围的僵尸,但重新注册SIGCHLD的配置为SIG_IGN不会有同样的效果)
- 知道内核维护(PID ,终止状态,资源使用信息)僵尸进程什么的“资源使用信息”
有些信息是什么运行的程序的含义:
time my_program
将报告。这些值通常在SIGCHLD的siginfo结构中报告(它不完全是对wait
的调用),但也可通过调用系统调用(在某些系统上)的waitid
形式获得。有关此结构的信息,请参阅man sigaction
。
- 僵尸的PPID()如何= 1,它仍然僵尸,(INIT收割植物大战僵尸,因为它等待()默认情况下)
僵尸其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 */
- 可僵尸拒绝释放内存的一些锁?
僵尸不能容纳任何东西。他们失去了所有的内存页面,打开文件句柄等等。几乎所有的操作系统都可以弄清楚如何释放应该被释放。这不是一个错误,但要记住,操作系统必须知道它是应该被释放的东西。在用户空间创建资源非常简单,当程序死亡时应该释放操作系统不知道应该释放的资源。
甲僵尸进程是一个纯粹的PID和退出状态值。由于资源(pid)“属于”父项,因此无法释放pid。如果它被释放,另一个进程可能会被分配相同的pid,然后父进程可能会发送信号到一个不相关的进程;即使父母第一次等待确定孩子是否退出,也无法避免竞争条件。
...我想我错过了一些东西。你正在从事什么僵尸进程的定义? – 2010-10-04 17:46:54
已退出,但其父母未通过“waitpid”或类似接口获得退出状态通知的子进程。 – 2010-10-04 17:56:35
啊,是的。抱歉。我只是意识到我一直在读“僵尸”,并想着“孤儿”。谢谢。 – 2010-10-04 18:16:16
如果您有兴趣了解正在运行的进程列表中的僵尸进程使用:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
pid_t p = fork(); // creates child process and stores the returned PID
if (p != 0) // executed by parent process
{ sleep(1); /* the child process terminates while the parent process sleeps,
the child then becomes a zombie process because the returned status
of the terminated child process isn't checked via a wait() */
system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal
}
else // executed by child process
{
exit(0); // the child process terminates immediately
}
return 0;
}
您可以通过Z +识别僵尸进程列表:
注意:如果您使用的是Windows,则必须修改代码。
属于superuser.com – 2010-10-04 17:46:18
@Paul R我不这么认为,这件事情是根据系统编程进行的。 – Searock 2010-10-04 17:54:30