问题标签 [waitpid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ptrace - ptrace(PTRACE_SINGLESTEP) + waitpid = SIGCHLD
我正在跟踪一个多线程应用程序,10 次中有 9 次,断点处理工作得很好,但有时我得到一个 SIGCHLD 事件而不是 SIGTRAP。
这是顺序:
- 应用程序正在运行,主线程命中 INT3
- 调试器的 waitpid 返回 SIGTRAP
- 调试器 SIGSTOP 使用 tgkill 对尚未“t(跟踪停止)”的所有线程进行 SIGSTOP
- 调试器在 INT3 线程上运行 ptrace(PTRACE_SINGLESTEP)(在修复 RIP 和 0xCC 字节之后)
- 调试器 waitpid 并期望 SIGTRAP,但改为获取 SIGCHLD
我应该用这个 SIGCHILD 做什么?忽略它会使调试器永远停留在后面的等待进程中。使用带有初始 PTRACE_SINGLESTEP 的 PTRACE_CONT 螺钉将其注入被调试者。
似乎它只发生在主线程(PID==TID),而不是子线程(又名 LWP)。
我在虚拟框中使用 UBUNTU 12.04 64bit。
c - 使用中的 waitpid() 示例?
我知道这waitpid()
是用来等待一个过程完成的,但是如何准确地使用它呢?
这里我想做的是,创建两个孩子并等待第一个孩子完成,然后在退出之前杀死第二个孩子。
linux - 如何在主程序中调用 `wait()` 设置的 `SIGCHLD` 处理程序的插件中安全地`waitpid()`
我正在为需要执行一些子进程并读取它们的输出的工具包编写一个模块。但是,使用该工具包的主程序也可能会产生一些子进程并设置一个信号处理程序,SIGCHLD
为其调用wait(NULL)
以摆脱僵尸进程。因此,如果我在 mywaitpid()
中创建的子进程 exit ,则在调用信号处理程序之前处理子进程,因此wait()
信号处理程序中的 in 将等待下一个进程结束(这可能需要永远)。这种行为在waitpid 的手册页中进行了描述(参见被授权者 2),因为 linux 实现似乎不允许该wait()
家族处理SIGCHLD
. 我已经尝试popen()
过posix_spawn()
他们都有同样的问题。我也尝试过使用 doublefork()
以便直接子级立即存在,但我仍然无法收到waitpid()
调用后SIGCHLD
的 garentee。
我的问题是,如果程序的其他部分设置了一个调用的信号处理程序wait()
(也许它应该调用waidpid
,但这不是我可以控制的),有没有办法安全地执行子进程而不覆盖SIGCHLD
处理程序(因为它可能在某些程序中做某事有用)或任何僵尸进程。
一个显示问题的小程序在这里(请注意,主程序仅在长期子退出后退出,而不是使用waitpid()直接等待的短程序):
c - waitpid 返回 pid=0 和 WIFEXITED=1 如何获取 pid?
脚步:
在不同的程序组中分叉并启动进程
使用 SIGTSTP 停止进程
使用 SIGCONT 重新启动进程
进程结束
问题:SIGCHLD 处理程序具有:
在返回 pid=0 和 WIFEXITED=1 时,进程退出,但我无法获取 pid?我需要pid。
从手册页中:“如果指定了 WNOHANG 并且 pid 指定的一个或多个子项存在,但尚未更改状态,则返回 0”
但似乎状态已更改为退出。
c - 为什么在调试器中运行时waitpid返回-1?
我正在使用 fork 在 Mac 平台上创建一个进程,并等待子进程在父进程中完成。但是waitpid
返回 -1 和 errno 是 4 (EINTR)。
可以重现此问题的示例代码如下:
当我在其中运行此代码时,GDB
否则LLDB
将assert
始终被击中。如果不在调试器中运行,它将不会返回 -1。
debugger
我认为我对如何或如何工作有一些不明白的地方fork/waitpid
。那么任何人都可以解释为什么会发生这种情况吗?
c++ - waitpid 似乎没有在等待
我有一个简单的功能 - 它的目的是在覆盖之前将文件复制到 .old 。因为我很懒(这里的答案建议这样做),所以我分叉并使用 cp 来完成这项工作。
然后我调用 waitpid 并检查返回码。
调用它的代码调用我的复制函数,然后立即打开文件进行读取。不知何故,调用代码似乎在 cp 调用之前运行 - 新文件是被复制的。最好的例子是文件和备份都不存在。两者都是创建并包含我的保存调用输出的内容。
我正在努力查看我哪里出错了,我们将不胜感激。
c - _exit()、fork() 和 waitpid() 系统调用
所以,我从子线程退出回到父线程。我正在使用 _exit() 系统调用。我想知道一些事情。一个是我孩子的 _exit 参数。这是我的子进程正在执行的代码:
我使用 status 是因为在我的父线程中我在 waitpid() 系统调用中使用它。这是子进程完成后执行的父进程的代码。
在这里,我使用 waitpid() 系统调用来确保孩子已退出,然后使用 status 检查它是否已正确退出。我想知道我是否以正确的方式来创建孩子并退出它。
然后我还想知道我是否正确地检查了父母中孩子的退出情况。
谢谢你的帮助!
c - C:使用 waitpid 和命令行输入的“运行”命令
作为我的代码的一部分,我正在尝试编写一个函数,以便用户可以键入
用户只需键入“运行日期”,程序就会显示底部两行。到目前为止,这就是我在我的职能中所拥有的..
这还没有产生,但我想知道到目前为止这是否正确以及我是否遗漏了重要部分!谢谢你。
c - 失败/退出时监视和重新启动子进程
我创建了一个监视子进程并在它失败或退出时重新启动它的基本示例。这样做的首选/更强大的方法是什么?持续轮询状态变化是一种好习惯吗?我的理解是我应该使用类似的东西,SIGCHLD
但找不到任何好的例子。
我主要是嵌入式 C 编码器,这是我第一次尝试理解fork()
. 该代码的目的最终将是监视对另一个程序的调用,exec()
并在它失败或完成时重新启动该程序。
编辑:
在@cnicutar 发表评论后,我以一种我认为更有意义的方式重写了下面的示例,希望以后对某些人有用。我希望父母在处理其他事情的同时监控子进程,并在子进程失败/完成时对exec
新进程进行新的调用。fork
我想尝试使用 unix 信号来实现这一点
c - cat/waitpid 上的段错误(在 C 中执行)
我和我的朋友正在尝试编写一个 shell。我的问题是运行'cat'命令然后用^C退出STDIN会使我的程序在waitpid上出现段错误,所以退出我的程序......(我当然不想要什么!)
每个命令都运行良好,我没有任何其他问题......我只是在询问它以及如何解决这些(大)问题。
谢谢你们的帮助!请参阅我在下面执行命令的代码:
我得到了答案,谢谢:)。