Linux、waitpid、WNOHANG、子进程、僵尸

2024-03-01

我作为守护进程运行我的程序。

父进程只等待子进程,当子进程意外死亡时,再次fork并等待。

for (; 1;) {
  if (fork() == 0) break;
  int sig = 0;
  for (; 1; usleep(10000)) {
    pid_t wpid = waitpid(g->pid[1], &sig, WNOHANG);
    if (wpid > 0) break;
    if (wpid < 0) print("wait error: %s\n", strerror(errno));
  }
}

但是当子进程被-9信号杀死时,子进程就会进入僵尸进程。

waitpid应该立即返回子进程的pid!
But waitpid大约90秒后得到pid号,

cube     28139  0.0  0.0  70576   900 ?        Ss   04:24   0:07 ./daemon -d
cube     28140  9.3  0.0      0     0 ?        Zl   04:24 106:19 [daemon] <defunct>

这是父亲的踪迹

父亲没有被卡住,wait4 总是被调用。

strace -p 28139
Process 28139 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0
nanosleep({0, 10000000}, NULL)          = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0

大约 90 秒后,父亲收到了 SIGCHILD,并且 wait4 返回了死亡孩子的 pid。

--- SIGCHLD (Child exited) @ 0 (0) ---
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WNOHANG, NULL) = 28140

为什么子进程不立即退出?相反,它却意外地变成了僵尸。


我终于发现 lsof 深度跟踪期间存在一些 fd 泄漏。

修复 fd 泄漏后,问题就消失了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux、waitpid、WNOHANG、子进程、僵尸 的相关文章

  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 如何获取进程的错误信息?

    For vsinstr coverage hello exe 我可以使用 C 代码如下 Process p new Process StringBuilder sb new StringBuilder COVERAGE sb Append
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • as3 Main-Timline 调用从 Child.swf 加载的类中的函数

    更新 好的 我准备放弃包和类 没有答案 不知道该怎么办 我试图让问题变得更容易 并发表了一篇新文章 但我对此投了反对票 as3调用另一个类中的函数 https stackoverflow com questions 10451708 as3
  • 当我们在java中使用连接两个字符串对象时编译器如何工作

    class Simple public static void main String args String s Sachin Tendulkar System out println s Sachin Tendulkar 编译器将其转换
  • 将逻辑放入 ViewModel get'ers 中

    您如何看待将 Get logic 放入 ViewModel 的 getter 中 就像是 public class DummyViewModel public int Id get set private DummyObject myObj
  • 具有凭据的 WebClient 仍未下载文件

    我正在尝试使用用户名 密码从网站下载文件 您需要支付注册帐户的费用才能下载文件 我们已经这样做了 我尝试传入用户名 密码并下载文件 如下所示 if docUrl null if string IsNullOrEmpty username s
  • HashCode 给出负值

    我通过执行以下函数将传入字符串转换为哈希码 但某些值是负数 我认为哈希值不应该是负数 请告诉我我做错了什么 int combine srcadd dstadd sourceport destinationport protocol hash
  • 如何在 TypeScript 中创建类似枚举的类型?

    我正在为 TypeScript 的 Google 地图 API 编写定义文件 我需要定义一个类似枚举的类型 例如 google maps Animation其中包含两个属性 BOUNCE and DROP 在 TypeScript 中应该如
  • 解析错误:语法错误,php 中出现意外的 T_STRING

    我收到错误
  • 放大“无法验证客户端的秘密哈希”

    我们一直在使用 Amplify 和 Cognito 为部署到 Lambda 的 Angular6 应用程序注册用户 客户希望从电子邮件过渡到用户名作为主要用户标识 所以我们创建了一个新的用户池 客户端 我看不到配置设置 我只是获得了新的用户
  • 如何使用java读取Json中的所有键而不指定键名

    尝试读取 Json 消息 如下所示 employees firstName John lastName Doe firstName Anna lastName Smith firstName Peter lastName Jones 我想读
  • 转换 Observable 中的数据

    我正在从我的 Angular 服务上的 Observable 中检索项目列表 在每个项目中 我都有一个包含主题列表的数组 对于每个主题 我都需要再次调用以获取其详细信息 例如名称 描述等 数据结构 post1 subjects books
  • C 是否有通用的“指向指针的指针”类型?

    例如 如果我想编写一个将指针清空的 free 我可以编写如下内容 void myfree void data free data data NULL 但是 当我尝试编写此内容时 我收到编译器警告 来自 gcc 4 6 2 warning p
  • 同步引用完整性表和枚举

    我经常思考这个问题 所以想请教一下大家 假设我有一个如下所示的数据库表 Table Visibility Id Value 0 Visible 1 Invisible 2 Collapsed 这只是一个用于确保引用完整性的表 它基本上是存储
  • 检查其他用户是否有写入文件的权限

    在安装过程中 我需要检查用户提供的路径是否对指定用户可写 执行Setup exe 仅适用于Windows的软件 的用户可能无法写入路径 像 fileserver share这样的UNC路径 所以我认为如何检查写入目录或文件的权限 https
  • 如何根据RSA的公开指数和模生成DER/PEM证书?

    众所周知 公钥由公共指数和模数组成 我的问题是 如何根据RSA的公开指数和模生成DER PEM证书 预先非常感谢您 有了公共指数和模数 您最希望得到的结果是 BEGIN PUBLIC KEY MIGGAoGAfHlcdrcuOK6C02rb
  • NSDictionaryController 似乎没有观察到内容字典的更改

    我一定错过了一些简单的东西 但是我在将 tableView 绑定到 NSDictionaryController 时遇到了一些麻烦 这是我当前方案的模型 TableViewColumn bindsTo gt DictionaryContro
  • cURL 到 C# web 请求

    我正在尝试将 cURL 脚本转换为 C 脚本 如果我想发布图像 是否必须将其转换为字符串 当我尝试运行脚本时 我从目标计算机收到异常 不幸的是 我无权查看目标机器上的代码 ch curl init curl setopt ch CURLOP
  • 在android fb graph api中获取空响应

    我一直在尝试使用fb graph api但是reponse我得到的是null当我尝试在我的 Android 应用程序中获取页面的帖子时 我正在尝试从我使用过的 ID 页面获取页面提要 我希望得到包含提要的图形响应 但我有一个null res
  • matplotlib 中 Poly3DCollection 图的透明度

    我正在尝试使用 Python 的神奇 Matplotlib 包绘制一些对象 这些对象由实现的点组成plt scatter 和补丁实现Poly3DCollection 我希望补丁具有轻微的透明度 以便可以看到补丁后面的点和边缘 这是我已经生成
  • Spring 3 MVC Controller集成测试-将Principal注入到方法中

    作为 Spring 3 MVC 的一部分 可以将当前登录的用户 原理 对象注入到控制器方法中 E g Controller public class MyController RequestMapping value update meth
  • Linux、waitpid、WNOHANG、子进程、僵尸

    我作为守护进程运行我的程序 父进程只等待子进程 当子进程意外死亡时 再次fork并等待 for 1 if fork 0 break int sig 0 for 1 usleep 10000 pid t wpid waitpid g gt p