- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 RedHat Linux 中编写了一个简单的 C 程序,它在调用 execv 后使用 waitpid 等待子进程。
int main( int argc, char * argv[] )
{
int pid;
int status = 0;
int wait_ret;
const char * process_path = argv[1];
if ( argc < 2 )
{
exit( EXIT_FAILURE );
}
pid = fork(); //spawn child process
if ( 0 == pid ) //child
{
int ret = execv( process_path, &argv[1] );
if ( ret )
{
printf( "execv failed: %s\n", strerror( errno ) );
}
exit( EXIT_SUCCESS );
}
//wait for the child to terminate
wait_ret = waitpid( pid, &status, WUNTRACED );
if ( -1 == wait_ret )
{
printf( "ERROR: Failed to wait for process termination\n" );
exit( EXIT_FAILURE );
}
// ... handlers for child exit status ...
return 0;
}
我将其用作我正在运行的某些进程的简单看门狗。
我的问题是,特别是一个进程在退出时没有被 waitpid 收割,而是在 waitpid 挂起时永远处于僵尸状态。我不确定为什么 waitpid 一旦变成僵尸(可能是泄漏的文件描述符或其他东西)就无法获取此进程。
我可以使用 WNOHANG 标志并轮询 child 的 stat proc 文件来检查僵尸状态,但我更喜欢更优雅的解决方案。也许我可以使用某些功能来获取 Zombie 状态而无需轮询此文件?
有谁知道 waitpid 的替代方法,它会在进程变成僵尸时返回?
附加信息:
在其中一个线程中调用 exit( EXIT_FAILURE);
正在关闭子进程。
cat /proc/<CHILD_PID>/stat
(退出前):
1037(MY_PROGRAM)S 1035 58 58 0 -1 4194560 1309 0 22 0 445 1749 0 20 0 20 0 13 0 13 0 4399 2234776 1136 4294967295 33367162880 17 0 0 0 26 0 0 3338489412 3338507560 3338600448
cat /proc/<CHILD_PID>/stat
(退出后):
1037 (我的程序) Z 1035 58 58 0 -1 4227340 1316 0 22 0 464 1834 0 0 20 0 2 0 4399 0 0 4294967295 0 0 0 0 0 0 0 4 31850 4294967217 0 0 6 0 0 2 0 0 0
请注意,在这种情况下,子 PID 为 1037,父 PID 为 1035。
最佳答案
任何终止的进程都会变成僵尸,直到它被 wait
调用收集起来。这里的等待似乎并不是在所有情况下都会发生。
从给出的代码中我无法弄清楚为什么等待没有发生并且进程仍然是僵尸。 (反正不是没有运行它)
但不是仅等待特定的 pid
,您可以通过使用 -1 作为 waitpid
的第一个参数来等待 任何 child .不要使用 WNOHANG
,因为它需要繁忙的轮询(不要那样做)。
您可能还想删除 WUNTRACED
除非您有特定的理由将其包含在内。但是放弃它并看看它有什么不同没有坏处。
关于c - 使用 C 以编程方式检查 Linux 中的僵尸子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50541461/
更新:-[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)调试错误,但我无法理解所呈现的调
我是一名优秀的程序员,十分优秀!