以下程序如何工作并在 linux 下创建 Zombie 进程?
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
sleep (60);
}
else {
exit (0);
}
return 0;
}
以下程序如何工作并在 linux 下创建 Zombie 进程?
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
sleep (60);
}
else {
exit (0);
}
return 0;
}
它创建孩子并且不等待(使用其中一个 wait* 系统调用)。僵尸就是这样:父母还没有等待的孩子,内核必须为他们维护一些信息 - 主要是退出状态 - 以便能够将其返回给父母。
该setsid()
命令丢失。
每个 *nix 进程都会产生一个必须回收的退出状态。如果子进程应该首先终止,则应该由父进程使用 wait() 语句来获得。
当父进程在子进程之前终止时,该setsid()
命令将父进程切换到 init。
Root 应该能够使用 kill -9 从进程列表中删除僵尸。没有经验的程序员有时会忽略setsid()
,这将隐藏产生错误的错误,否则会阻塞磁盘驱动器。
在过去,系统管理员会使用僵尸来识别需要额外培训才能编写出好的代码的没有经验的程序员。
当内核过早终止程序时,init 获取的退出状态会发送到 syslog。该退出状态用于识别导致提前终止的错误的性质(程序员未处理的错误情况)。
以这种方式报告的退出状态成为 syslog 或 klog 文件的一部分,这些文件通常用于调试代码。