我有这个代码从APUE书和练习中我需要用waitid()replacewait():
#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); }
我试过这个:
id_t pid; siginfo_t info; pid = fork(); // ... waitid(P_PID,pid,&info,WNOHANG) // also tried with WNowAIT
并得到了waitid错误:无效的参数。 当我尝试: waitid(P_PID,WEXITED)我得到信号编号:17所有三个waitid()调用,其中原始代码的输出分别是信号7,6和8。 为什么我得到“无效的论点”,我怎样才能强制系统产生信号7,6和8?
C ++ :: :: ntohs()在较高的优化级别上失败
一旦我们input特定的密钥,如何使C程序退出?
使用vbscript访问窗口的标题
检测应用程序是否固定到任务栏
从Visual Studio Solution生成Make文件(用于GCC)
MinGW如何实现C ++库支持?
如何将Windows进程重置为以前的状态?
waitid(P_ALL,WEXITED) ,其中info是siginfo_t类型,收集与wait(&status)相同的子进程。 它们的区别在于
waitid()的siginfo_t *参数及其解释。 wait()的int *参数及其解释和
这两个函数的返回值的含义。
你似乎想waitid()都要用waitid()等待一个特定的孩子,那就是: waitid(P_PID,WEXITED) 。
请注意, wait()返回成功收集的子进程的PID, waitid()在成功时返回0 。
还要注意,虽然siginfo_t结构有一个名为si_status的成员,但它不等于wait()通过它的第二个参数提供给调用者的值。 siginfo_t.si_status是进程的实际退出代码,而wait()提供的状态是几个不同字段的位掩码。 你可以通过WEXITSTATUS()宏获得后者的退出代码,但是明智的做法是检查它是否正常终止( WIFEXITED() )与被发信号( WIFSIGNALED() )。
从男人waitid:
The child state changes to wait for are specified by ORing one or more of the following flags in options: WEXITED Wait for children that have terminated. WSTOPPED Wait for children that have been stopped by delivery of a signal. WCONTINUED Wait for (prevIoUsly stopped) children that have been resumed by delivery of SIGCONT. The following flags may additionally be ORed in options: WNOHANG As for waitpid(). WNowAIT Leave the child in a waitable state; a later wait call can be used to again retrieve the child status @R_537_4045@ion.
和:
EINVAL The options argument was invalid.
所以,你应该提供WEXITED。
#define pr_exit(n) printf("%dn",n) #define err_sys perror
#包括提供声明,我所看到的是0x700,0x86和0x88的退出状态,AFAICS是完全正确的。
这些退出状态分别是{正常退出状态7},{退出信号6}和{退出信号8}。 请注意,由于信号7,退出状态7与退出状态不同。
(信号17是在linux的SIGCHLD,我不明白为什么你的孩子会退出信号17,要么他们或父母将不得不建立一个SIGCHLD处理程序,以便导致SIGCHLD具有特定和“不寻常的”行为。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。