- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
维基百科说“终止但从未被其父进程等待的子进程成为僵尸进程。”我运行这个程序:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid, ppid;
printf("Hello World1\n");
pid=fork();
if(pid==0)
{
exit(0);
}
else
{
while(1)
{
printf("I am the parent\n");
printf("The PID of parent is %d\n",getpid());
printf("The PID of parent of parent is %d\n",getppid());
sleep(2);
}
}
}
这就创建了一个僵尸进程,但是我不明白为什么要在这里创建一个僵尸进程?
程序的输出是
Hello World1
I am the parent
The PID of parent is 3267
The PID of parent of parent is 2456
I am the parent
The PID of parent is 3267
The PID of parent of parent is 2456
I am the parent
....
.....
但为什么在这种情况下“子进程终止但未被其父进程等待”?
最佳答案
在您的代码中,zombie 是在 exit(0)
上创建的(下面有箭头的评论):
pid=fork();
if (pid==0) {
exit(0); // <--- zombie is created on here
} else {
// some parent code ...
}
为什么?因为你从不wait
编辑它。当有人调用 waitpid(pid)
,它返回有关进程的事后分析信息,例如它的退出代码。不幸的是,当进程退出时,内核不能直接处理这个进程入口,否则返回码将丢失。所以它等待某人wait
在它上面,并保留这个进程条目,即使它除了进程表中的条目之外并没有真正占用任何内存——这正是所谓的僵尸。
避免创建僵尸的选项很少:
添加waitpid()
父进程中的某处。例如,这样做将有助于:
pid=fork();
if (pid==0) {
exit(0);
} else {
waitpid(pid); // <--- this call reaps zombie
// some parent code ...
}
执行双重 fork()
在孙子还活着的时候获得孙子并退出子代。 init
将自动收养孙辈如果他们的 parent (我们的 child )去世,这意味着如果孙子去世,它将自动wait
由 init
编辑.换句话说,您需要执行以下操作:
pid=fork();
if (pid==0) {
// child
if (fork()==0) {
// grandchild
sleep(1); // sleep a bit to let child die first
exit(0); // grandchild exits, no zombie (adopted by init)
}
exit(0); // child dies first
} else {
waitpid(pid); // still need to wait on child to avoid it zombified
// some parent code ...
}
明确忽略父级中的 SIGCHLD 信号。当 child 去世时, parent 会被送去SIGCHLD
让它对 child 死亡使用react的信号。您可以调用waitpid()
收到此信号后,或者您可以安装显式忽略信号处理程序(使用 signal()
或 sigaction()
),这将确保 child 不会变成僵尸。换句话说,像这样:
signal(SIGCHLD, SIG_IGN); // <-- ignore child fate, don't let it become zombie
pid=fork();
if (pid==0) {
exit(0); // <--- zombie should NOT be created here
} else {
// some parent code ...
}
关于linux - 为什么会存在僵尸进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16078985/
更新:-[NSIndexPath行]:消息发送到已释放实例0x895fe70 当我在设备上运行我的应用程序并进行分析时,它说: 将一个Objective-C消息发送到地址为0xaa722d0的已释放对
我现在大部分时间都在尝试调试我的 Backbone 多页面应用程序以摆脱“僵尸”,但不幸的是没有成功。在今天之前,我什至没有意识到我有一个僵尸问题。我做错了什么? 这是我的区域经理: var re
我确实读过这篇文章:https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/ 设置一些上下文:文章
调试使用 iPhone SDK 3.x 目标构建的应用程序时是否支持 NSZombiesEnabled? 此外,如果支持的话,我可以在哪里获取支持的可能级别的列表吗? 最佳答案 是的,设备和模拟器都支
我正在尝试了解主干,并且目前正在努力尝试僵尸 View 。我已经阅读了很多有关此问题的堆栈溢出信息,但仍然无法解决。 为了简单起见,我设置了两个需要切换的 View (无数据)。 到目前为止,我所做的
我正在尝试使用 psycopg 和多处理插入和更新几百万行。查看 http://initd.org/psycopg/docs/usage.html#thread-and-process-safety
我的应用程序在 Linux 机器上进入僵尸状态,它无法被杀死并且 gdb 无法附加到它,我无法调试。现在我想知道最后调用的函数或回溯,无论如何我可以得到这个吗?/proc/pid/stat 下是否有我
我将我的程序作为守护进程运行。 父进程只等待子进程,当它意外死亡时,fork并再次等待。 for (; 1;) { if (fork() == 0) break; int sig = 0;
注意:我们使用的是 Backbone 1.0.0 我对 Backbone 比较陌生,并且打算通过前同事编写的一些代码。我不是盲目地复制粘贴东西,而是想了解他是如何做事的,这就是我开始思考处理僵尸 Vi
我的 Backbone Marionette 应用程序出现问题,我的 subview 没有被完全破坏。您如何正确销毁要替换为另一个布局/项目 View 的嵌套布局 View ? 我对 Marionet
我有两个应用程序在一个服务器上运行,它们执行 headless (headless)浏览任务。每次浏览时,Xvfb 进程并没有死,而是变成了僵尸。我可以用以下脚本确认这一点。 require 'hea
我正在尝试使用 Marionet 模块来玩 Backbone。 例如。实现“加载微调器”,正如 David Sulc 在“contact manager”应用程序中所做的那样,Firefox 的“ba
当我尝试使用 Xcode 菜单(Product - Archive)直接存档项目时,效果很好。但是当我尝试从集成菜单 (bot) 执行它时,出现了这个错误: Build operation faile
我有一个从 nib 构建的 MainWindow 类,设置如下: - (void)applicationDidFinishLaunching:(UIApplication *)application
我关注 this answer跟踪我的应用的 EXC_BAD_ACCESS。是的,我有一个僵尸物体。当我试图找出哪一行代码是错误的时,我发现所有负责任的图书馆都是基金会的。 当我尝试这样做时: Whe
我是 iOS 开发的新手,非常感谢您帮助我找出我遇到的错误的根本原因。 我尝试使用 Instruments(即 Allocations-Zombie Profiler)调试错误,但我无法理解所呈现的调
我是一名优秀的程序员,十分优秀!