我有来自APUE书和练习的代码,我需要用waitid()替换wait():
#include "apue.h"
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0) /* child */
exit(7);
if (wait(&status) != pid) /* wait for child */
err_sys("wait error");
pr_exit(status); /* and print its status */
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0) /* child */
abort(); /* generates SIGABRT */
if (wait(&status) != pid) /* wait for child */
err_sys("wait error");
pr_exit(status); /* and print its status */
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0) /* child */
status /= 0; /* divide by 0 generates SIGFPE */
if (wait(&status) != pid) /* wait for child */
err_sys("wait error");
pr_exit(status); /* and print its status */
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
id_t pid;
siginfo_t info;
pid = fork();
// ...
waitid(P_PID, pid, &info, WNOHANG) // also tried with WNOWAIT
Run Code Online (Sandbox Code Playgroud)
并得到waitid错误:参数无效.当我尝试:
waitid(P_PID, pid, &info, WEXITED)我得到所有三个waitid()调用的信号编号:17,其中原始代码的输出分别是信号7,6和8.为什么我会得到"无效参数"?如何强制系统生成信号7,6和8?
waitid(P_ALL, 0, &info, WEXITED),其中info的类型为siginfo_t,收集与 相同的子进程wait(&status)。它们的不同之处在于
siginfo_t *的论证及其waitid()解释vs。int *的论证及其wait()解释,以及然而,您似乎希望waitid()每次都等待一个特定的孩子,那就是:waitid(P_PID, pid, &info, WEXITED)。
请注意,虽然wait()返回成功时收集的子进程的 pid,但成功时waitid()返回。0
另请注意,虽然该siginfo_t结构有一个名为 的成员si_status,但它并不等于wait()通过第二个参数提供给调用者的值。 siginfo_t.si_status是进程的实际退出代码,而 提供的状态wait()是几个不同字段的位掩码。您可以通过宏从后者获取退出代码WEXITSTATUS(),但明智的做法是检查它实际上是否正常终止(WIFEXITED())与是否收到信号(WIFSIGNALED())。
| 归档时间: |
|
| 查看次数: |
1928 次 |
| 最近记录: |