问题标签 [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 回答
9485 浏览

c - Ubuntu 中的 wait() 函数

我正在 Ubuntu 中学习进程及其行为,但我对 wait() 有点困惑。所以我的问题是:

  1. while(wait(NULL)>0);语句如何 正在工作中?
  2. wait()中NULL的目的是什么?

我已经在终端中看到了输出,但是即使它执行了 wait() 函数,父级也在执行并生成子级。父级执行不应该停止吗?这是代码:

}

我知道这是一个非常蹩脚的问题,但这是人们学习的方式:)

谢谢

0 投票
2 回答
463 浏览

fork - 为什么要在父级中 fork() 然后 wait() ?

我知道 fork()、wait()、waitpid()、僵尸进程……我通过阅读 W. Richard Stevens 这本非常好的书来理解它们。

如果我们不在父母中调用 wait() ,孩子在终止后会变成僵尸......这很糟糕!

如果我们在 parent 中调用 wait(),则 parent 等待 child 终止,接收终止状态然后继续。写?

我已经经历了许多调用 fork() 一次然后在父级中调用 wait() 的示例。

但是,如果父母要等待孩子并在孩子终止后继续,那么就没有实际的多任务处理(技术上是的,有两个进程。但逻辑上没有用)那我们为什么在这里调用 fork() 呢?

我们可以先编写子代码,然后编写父代码,而不是 fork() 和 wait() 作为单个进程...不是更好吗?

谢谢!

0 投票
1 回答
952 浏览

linux - 子进程相互等待

我创建了三个进程,我想同步他们的工作。具体来说,我希望第一个进程等待第二个,第二个等待第三个。基本上以创建它们的相反顺序执行它们。

这是我到目前为止所做的。

我正在使用 i 检查我所在的子进程,因为我假设我在子进程中得到了正确的 i,所以如果 i = 0,我实际上是第一个子进程。这个假设是真的吗?在任何情况下,我都没有得到我想要的顺序,实际上这些进程是按照它们的自然顺序执行的,绕过了我放置的 waitpid 调用。有任何想法吗?

0 投票
1 回答
9534 浏览

c - 使用系统调用 fork() execvp() wait() pipe() 实现多管道 - 它根本不起作用

我需要实现我的外壳来处理多个管道命令。例如,我需要能够处理这个:ls | grep -i cs340 | sort | uniq | cut -c 5. 我假设问题是我没有将上一个命令的输出传递给下一个命令的输入。当我执行我的代码时,它没有给我任何输出。我正在使用这个伪代码:

这是处理多个管道的函数的源代码。

功能execvp()采用结构数组。我检查了我所有的解析部分,它工作正常。这是execute_multiple_commands()我遇到问题的功能。

这是结构的代码:

0 投票
3 回答
2661 浏览

c++ - waitpid/wexitstatus 返回 0 而不是正确的返回码

我有下面的辅助函数,用于在 posix 系统上执行命令并获取返回值。我曾经使用,但如果应用程序在/有机会完成其工作之前运行并退出,popen则无法获取应用程序的返回码。popenpopenpclose

下面的辅助函数创建一个进程分支,用于execvp运行所需的外部进程,然后父进程waitpid用于获取返回码。我看到它拒绝运行的奇怪情况。

wait当使用=调用时truewaitpid无论如何都应该返回应用程序的退出代码。但是,我看到stdout指定返回码不为零的输出,但返回码为零。在常规 shell 中测试外部进程,然后echoing$?返回非零,因此外部进程没有返回正确的代码不是问题。如果有任何帮助,正在运行的外部进程是mount(8)(是的,我知道我可以使用mount(2),但除此之外)。

我提前为代码转储道歉。其中大部分是调试/记录:

请注意,该命令使用正确的参数运行正常,该函数继续运行,没有任何问题,并WIFEXITED返回TRUE. 但是,WEXITSTATUS当它应该返回其他东西时,返回 0。

0 投票
2 回答
3086 浏览

c - waitpid 错误用法?

我正在尝试从父进程访问分叉子进程的退出状态,但我得到了奇怪的答案。有时,我得到 256 或有时我得到一个负数,具体取决于我指定 &status 还是仅指定 status。我知道我真的很亲近。有人可以为我提供一点帮助,我将如何获得 EXIT_STATUS

这是我的代码

0 投票
2 回答
10584 浏览

c++ - Linux、waitpid、WNOHANG 和僵尸

我需要能够:

  1. fork 一个进程并使其成为 execvp(我这样做了)
  2. 检查子进程execvp是否成功(不知道如何)
  3. 检查子进程是否完成(有问题)

我正在分叉一个进程,我没有任何方法可以检查孩子的 execvp 是否有效。如果它失败了,我需要能够知道它失败了。目前我正在使用

但似乎如果 pid 进程的 execv 失败,waitpid 不会返回 -1。

我怎么能检查呢?我阅读了 waitpid 手册页,但我不清楚;也许我的英语不够好。

编辑:为了解释更多:
我正在为家庭作业构建自己的终端。我需要输入一个命令字符串,比如说“ls”,然后我必须执行命令。
孩子分叉后,孩子调用 execvp 以执行命令(在我解析字符串之后),父母需要检查命令末尾是否有'&'。
如果命令末尾不存在符号“&”,则父级需要等待子级执行。

所以我需要知道 execvp 是否失败。如果它没有失败,那么父母使用 waitpid 等待孩子完成它的执行。如果失败,则父母将不会等待孩子。

0 投票
1 回答
9466 浏览

c - fork/exec/waitpid 问题

我试图通过检查 waitpid() 的结果来确定执行是否失败。但是,即使我运行一个我知道失败的命令并将问题写入 stderr,下面的检查也不会注册。这段代码可能有什么问题?

谢谢你的帮助。

0 投票
1 回答
178 浏览

perl - 为什么要为子进程执行 else 块?

这是一个带有forkwaitpid的程序。

输出可能如下所示。

现在有许多关于网络和书籍的类似程序fork,也就是说

if 块中的代码由父进程执行,else 中的代码由子进程执行。waitpid 用于等待孩子完成。

我的问题是

如何以及为什么为子进程执行 else 块?我知道 fork 已经创建了新的子进程。但是在 fork 语句之后如何执行 child(即 else 块)?有人可以逐步向我解释子进程,或者更深入地了解我缺少的东西,例如为什么子进程不执行下面的语句?

0 投票
2 回答
32196 浏览

c - 使用waitpid在后台运行进程?

如果在命令末尾找到“&”,我正在尝试模仿在后台运行进程的 bash 功能。我有以下功能......而且我认为它没有做我想做的事情

如果我只是运行“ls -l”,它会按预期工作..但是如果我想在后台运行 ls..并且让程序继续接受新命令,我调用该函数并将背景标志设置为 1,我希望它在后台运行进程,告诉我它已经创建了进程..然后提示接受下一个命令。