问题标签 [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.
perl - 为什么我从 Perl 的 system() 开始的进程不是子进程?
Perl 的 system() 启动一个进程,但打破了父/子关系?
测试.pl:
测试.sh:
当我运行 test.pl 时,它会找到并打印出 test.sh 的正确 pid。但是 waitpid() 返回 -1 并且 test.pl 退出。test.pl 存在后,test.sh 仍在运行。
看起来 test.sh 不是 test.pl 的子级,它会破坏 waitpid()。为什么会发生这种情况以及如何使 system() 行为?那是因为 Perl 会自动清除孩子吗?如果是,我该如何解决明确等待孩子的一般任务?
更新:
下面的答案建议使用 fork/exec。最初的问题是这样的:
从 Perl 脚本,运行启动服务的命令行实用程序。实用程序退出,但服务保留。
一段时间后,找到该服务的 pid 并等待它。
fork/exec 没有解决这个问题,尽管它解决了这个问题。
c++ - 生成的子退出状态 = 127
我使用 posix_spawnp 执行不同的进程,并检查状态(使用 waitpid)以确保正确创建了孩子
起初,这可以正确执行,我收到以下消息:
等待:PID 15911 | 状态 0 孩子以 RC=0 退出
多次执行同一个进程后,子进程开始退出,状态为 127。
等待:PID 15947 | 状态 32512 孩子以 RC=127 退出
发生这种情况后,我无法让孩子再次产卵。我将上面给出的代码部分包含在一个 for 循环中,但它不会正确生成。如果我重新启动父进程,它会工作一段时间,但同样的问题会在一段时间后再次出现。
我在这里做错了什么?
c - 用于 WIFSIGNALED、WIFSTOPPED、WIFCONTINUED 的 C 语言测试用例
我正在使用 waitpid() 和 signal() 并且我正在寻找可靠的测试用例来返回 WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = true 但找不到任何...
请告诉我如何确保那些返回 true 以便我可以调试我的代码?
此外,关于我应该使用 signal() 捕获哪些信号来测试这些宏的一些提示会很有帮助......
fork - 哪些系统不支持 waitpid 的 WNOHANG 选项?
我有一个用于管理子进程的库,该库依赖于将 POSIX WNOHANG 选项传递给 waitpid 以对进程执行非阻塞等待。据说并不是所有的系统都支持这个选项,但是我已经有一段时间没有研究过这些系统了。哪些系统不支持此选项?我想知道以便我可以尝试为这些系统找到解决方法,或者我可以决定不针对这些系统。
c - 为什么取消引用 (char*)0 的 Linux 程序并不总是出现段错误?
我正在测试旨在检测子进程何时出现段错误的代码。当这段代码并不总是段错误时,想象一下我的惊讶:
我在 Debian Linux 2.6.26 内核下运行;ksh93
我的外壳是来自 Debian软件包的 AT&T ksh
,版本 M 93s+ 2008-01-31。有时这个程序会出现段错误,但否则它只是以非零退出状态但没有消息而静默终止。我的信号检测程序报告以下内容:
在 pure 下运行ksh
表明 segfault 也很少见:
有趣的是,bash
每次都能正确检测到段错误。
我有两个问题:
谁能解释这种行为?
任何人都可以建议一个简单的 C 程序,它会在每次执行时可靠地发生段错误吗?我也尝试过
kill(getpid(), SIGSEGV)
,但我得到了类似的结果。
编辑:jbcreix 有答案:我的段错误检测器坏了。我被愚弄了,因为ksh
有同样的问题。我尝试过bash
并且bash
每次都做对了。
我的错误是我传递WNOHANG
到waitpid()
,我应该传递零。我不知道我当时在想什么!有人想知道 是怎么回事ksh
,但这是一个单独的问题。
perl - 为什么 Perl 中的 waitpid 会返回错误的退出代码?
我从 waitpid 得到错误的退出代码,我不知道为什么。有人可以给我一些想法吗?
我在这里做什么:
- 我开始我的孩子进程
open2
- 然后我等待它完成
waitpid
- 使用获取退出代码
$?
无论我从子进程返回什么,它总是返回 -1。我用 VS 调试器检查我的程序返回的退出代码为 0。VS 说这样的话:
我确保pids匹配。
有任何想法吗?
c - 确定终止进程的pid
我试图弄清楚发送 SIGCHLD 信号的进程的 pid 是什么,我想在为 SIGCHLD 创建的信号处理程序中执行此操作。我该怎么做?我正在努力:
因为我想等待任何产生的子进程。
c - waitpid 是否为已经退出的子进程产生有效的状态信息?
如果我fork
是子进程,并且子进程在父调用之前退出waitpid
,那么设置的退出状态信息是否waitpid
仍然有效?如果是,什么时候变得无效;即,如何确保我可以调用waitpid
子 pid 并在任意时间后继续获取有效的退出状态信息,以及如何“清理”(告诉操作系统我不再对退出感兴趣已完成子进程的状态信息)?
我在玩下面的代码,似乎退出状态信息在孩子完成后至少几秒钟内有效,但我不知道多久或如何通知操作系统我不会再次调用waitpid
:
perl - 为什么是 Perl 的 $?为分叉进程的退出代码返回错误的值?
考虑这个fork()的简单示例,然后在 Perl 中等待孩子死去:
在 Solaris 10 上运行脚本,我得到以下结果:
我怀疑 的值正在向上移动,因为当我exit(2)
在孩子中这样做时,输出变为512
.
我似乎在 perl 的waitpid中找不到这个记录。这是我系统上的错误还是我做错了什么?
c - 使用 waitpid() 后,我对 WIFSIGNALED()/WTERMSIG() 宏有疑问
在这段代码中,我从命令行启动一个程序,当它从不同于 SIGTERM(正常结束的信号)的信号关闭时,我的代码应该重新启动从命令行传递的初始程序。但事实并非如此,事实上我的代码从不重新启动程序说它已正确终止。在实践中我的条件“if(WTERMSIG(status)!=SIGTERM)”工作不好,为什么??????:'(
这是我的代码: