问题标签 [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.

0 投票
1 回答
3104 浏览

c - 在 while 循环中使用 wait() 而不是 waitpid()

我知道 wait() 和 waitpid() 之间的区别之一是 waitpid 有一个 WNOHANG 选项,它告诉 waitpid 如果有运行的子进程尚未终止,则不要阻塞。如:

如果我使用 wait() 而不是 waitpid(),如果有运行的子进程尚未终止,则无法阻止 wait() 阻塞。但是,我想知道 wait() 在这里是否可以正常工作,即使它可能会阻塞。

0 投票
1 回答
1761 浏览

c - 分叉一个长时间运行的进程并避免调用 waitpid 来清理僵尸?

我有一个长时间运行的进程(node.js),它调用 fork(作为 C++ 模块的一部分)。这会将新进程创建为 node.js 进程的子进程。但是,没有任何东西会等待/等待这个子进程,所以它在终止后仍然是一个僵尸。

是否可以在当前进程不是其父进程的情况下 fork() 一个进程,以便在终止时它不会保持在僵尸状态而是被清除?

如果不是,我能否以某种方式表明我不会对孩子调用 waitpid 并且不关心它何时终止?

如果失败了,我可以编写/找到一个可以执行 waitpid 的本机模块,但我需要确定它会:

  1. 不阻塞父进程(node.js)
  2. 调用模块函数后不留下任何僵尸

谢谢!

0 投票
2 回答
4225 浏览

c - WSTOPSIG(状态)== 22 & WTERMSIG(状态)== 9;这些数字从何而来?

我正在查看 esh (easy shell) 的实现,在这种情况下无法理解 22 和 9 是什么信号。理想情况下,有一个更具描述性的常数,但我找不到列表。

0 投票
1 回答
1223 浏览

c++ - 运行后台进程linux simple shell。C++

我正在 linux 中创建一个简单的 shell,但无法在后台运行命令。

到目前为止,这是我的代码:

command 和 argv 是我从用户那里得到的。

如果“&”是命令的最后一部分,我需要在后台运行命令。我已经用 bg 的布尔变量检查了这一点。但我在使用 WAITPID() 函数时遇到问题,我不确定它的去向。

0 投票
2 回答
107 浏览

c++ - 为什么这段代码会失败?孩子不等

好的,所以我一直在努力学习掌握子进程并正确等待它们完成。我已经阅读了很多 Stack Overflow Q/A,但我似乎仍然无法按照我的意愿让它工作。我一直在阅读/搜索这本书(C++ Primer plus 6th ed.)——我已经做了一些研究,但我仍然不能让它像我想要的那样等待。

因此,我在 Stack Overflow 上查看了几件事以供参考:Checking the status of a child process in C++

这是我到目前为止所尝试的:

现在这将显示Child #1 is in chargeSecond child is in charge然后它将混合两个命令(我ls在 locate 之间看到一些etc)。

我尝试过的第二件事:

这更多地基于我提供的链接,它产生了与我第一次测试运行相同的结果,除了它还会显示ERROR IN CHILD #1/2.

这些命令是无关紧要的,我只是想不明白我在这里做错了什么......我也尝试过将它们嵌套在 中else { //start second fork here },但我也无济于事。

根据我阅读waitpid(2)我应该使用的手册后的理解WNOHANGhttp://linux.die.net/man/2/waitpid

非常感谢任何建议/指针。

如果可能,请提交您将如何完成正确结果的示例代码(execute command 1 -> wait until done -> execute command 2 -> exit)

期待回复。

0 投票
2 回答
1036 浏览

c - waitpid(pid, status, options) 并不总是设置状态

我正在为一项任务复制壳管。我让管道全部工作(并且此后没有更改管道代码,因此已知它可以工作),但仍然需要在管道的某个步骤中发生执行失败的情况下终止管道。在实现该代码的某个时刻,管道开始出现意外行为。

长度为 2 的管道正常工作。长度大于 2 的管道以下列方式失败:

  1. 管道中的第一个命令执行
  2. 紧接着——通常在第一个命令完成执行之前——管道中的最后一个命令终止
  3. 然后第二个命令将挂起,显然没有收到来自第一个命令的输入。

这是使用 waitpid 的部分代码(无调试代码):

}

现在这就是为什么我认为 waitpid 部分应该受到指责的症结所在:由于分配需要一些奇怪的控制流,我发现将 cmd_status 的值初始化为 -2 很方便。日志功能将子进程的返回状态打印到日志中,文件说第二个函数的退出状态为-2,这当然意味着它没有设置程序的存在状态。似乎管道根本没有等待这些程序执行。

IE

输入“ls | grep 管道 | wc”

输出:

0 投票
2 回答
379 浏览

c - 按终止顺序打印?

我有一个程序,它生成一个随机数 n,然后循环 n 次。

在每次迭代中,它随机化 的值sleeptime,并调用 fork。子进程休眠sleeptime几秒钟,然后以索引变量的值退出。

然后父进程再次循环,等待每个进程终止。随着每个进程终止,我正在尝试注销进程的 pid 和 childid,但这是我遇到麻烦的地方。pid 按顺序打印,childid 保持为 0。

我究竟做错了什么?

免责声明,这是作业(此处的链接,可能随时消失),但我已经完成了几乎所有工作。我只是难以掌握它的这一方面。

0 投票
2 回答
8098 浏览

perl - 如何让waitpid阻塞循环

以下代码运行 2 个孩子,他们将等待 10 秒并终止。父母坐在一个循环中,等待孩子终止:

代码基于这个答案:Multiple fork() Concurrency

它工作正常,但父循环正在消耗处理器时间。top命令给出了这个:

在此处输入图像描述

这里的答案是:

作为额外的奖励,循环将在waitpid孩子运行时阻塞,因此您在等待时不需要繁忙的循环。

但对我来说,它不会阻塞。怎么了?

0 投票
1 回答
1368 浏览

c++ - waitpid() 之后来自 WTERMSIG 宏的异常信号编号

在等待子进程终止时,我从以下代码中看到异常的信号编号(例如 50、80 或 117)。我只从一个特定的子进程中看到这一点,并且我无法访问进程源代码,而且它只会在某些时候发生。

我想知道这些不寻常的值是什么意思,给定NSIG == 32的,以及在哪里可以在标题或手册页中找到一些文档?

请注意,此代码在循环中运行,逐渐发送更多威胁信号,直到孩子终止。

这是在 OSX 10.8.4 下运行的,但我也在 10.9 GM 种子中看到过它。

编辑如下修改代码使代码更加健壮,但是有时子进程会变得孤立,因为我猜循环不足以杀死子进程。

请注意,此代码是此类方法Process::unload()的一部分。

0 投票
0 回答
595 浏览

unix - 信号和waitpid共存

我有以下问题:我可以为 SIGCHLD 使用信号处理程序并在特定位置使用 waitpid(3) 吗?

这是我的场景:我启动一个监听套接字的守护进程(此时它是 TCP 还是 UNIX 套接字无关紧要)。每次客户端连接时,守护进程都会派生一个子进程来处理请求,并且父进程继续接受传入的连接。处理请求的孩子有时需要在服务器上执行命令;让我们假设在我们的示例中它需要执行这样的复制:

为此,clild 派生了一个新进程,该进程使用 execl(3)(或 execve(3) 等)来执行复制命令。

为了更好地控制我的代码,理想情况下,我希望使用 waitpid(3) 捕获执行副本的孩子的退出状态。此外,由于我的守护进程正在派生子进程来处理请求,因此我需要为 SIGCHLD 提供信号处理程序,以防止创建僵尸进程。

在我的代码中,我使用信号(3)为 SIGCHLD 设置了一个信号处理程序,我通过分叉两次来守护我的程序,然后我在我的套接字上监听传入的连接,我分叉一个进程来处理每个即将到来的请求和我的子进程分叉一个执行复制的子进程,试图通过 waitpid(3) 捕获其退出状态。

发生的情况是,当孙子进程死亡时,SIGCHLD 被我的处理程序捕获,在 waitpid(3) 采取行动并且 waitpid(3) 返回 -1 之前,即使孙子进程成功退出。

我的第一个想法是添加:

就在分叉子进程来处理我的连接客户端之前,没有任何成功。使用 SIG_IGN 也不起作用。

有没有关于如何使我的场景工作的建议?

提前感谢大家的帮助!

PS。如果您需要代码,我会发布它,但由于它的大小,我决定仅在必要时这样做。

PS2。我的意图是在 FreeBSD 中使用我的代码,但我的检查是在 Linux 中执行的。

编辑[已解决]:

我面临的问题解决了。“意外”行为是由我的 waitpid(3) 处理代码引起的,该代码在某些时候有问题。

因此,上述方法确实可以用于在类似守护程序的程序中允许 signal(3) 和 waitpid(3) 共存。

感谢您的帮助,我希望这种方法可以帮助希望完成这样事情的人!