我需要使用fork()和wait()函数来完成一个赋值。我们正在建模非确定性行为,并且如果存在多个可能的转换,则需要fork()程序。有两个子进程fork()和wait()
为了试着弄清楚fork和wait的工作方式,我刚做了一个简单的程序。我想现在我明白了这些调用是如何工作的,如果程序只分支一次,那么它会很好,因为父进程可以使用单个子进程的退出状态来确定子进程是否达到接受状态。
正如您从后面的代码中看到的,我希望能够处理必须有多个子进程的情况。我的问题是,你似乎只能使用_exit函数设置一次状态。因此,正如在我的示例中,父进程测试的退出状态显示第一个子进程发出0,因为它是退出状态,但没有关于第二个子进程的信息。
我试着简单地不_exit() - 拒绝,但是那个子进程将继续,实际上似乎有两个父进程。
对不起华夫饼,但我会很感激,如果有人能告诉我我的父母过程如何获得多个子过程的状态信息,或者我会很高兴父过程只注意到接受状态子进程,但在这种情况下,我将成功地需要退出具有拒绝状态的子进程。
我的测试代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main(void) {
pid_t child_pid, wpid, pid;
int status = 0;
int i;
int a[3] = {1, 2, 1};
for(i = 1; i < 3; i++) {
printf("i = %d\n", i);
pid = getpid();
printf("pid after i = %d\n", pid);
if((child_pid = fork()) == 0) {
printf("In child process\n");
pid = getpid();
printf("pid in child process is %d\n", pid);
/* Is a child process */
if(a[i] < 2) {
printf("Should be accept\n");
_exit(1);
} else {
printf("Should be reject\n");
_exit(0);
}
}
}
if(child_pid > 0) {
/* Is the parent process */
pid = getpid();
printf("parent_pid = %d\n", pid);
wpid = wait(&status);
if(wpid != -1) {
printf("Child's exit status was %d\n", status);
if(status > 0) {
printf("Accept\n");
} else {
printf("Complete parent process\n");
if(a[0] < 2) {
printf("Accept\n");
} else {
printf("Reject\n");
}
}
}
}
return 0;
}
好的。我明白。非常感谢您的回复。 – Joe 2010-04-25 14:28:10
再次感谢您的时间。那很棒。我在你的第一篇文章后制作了自己的工作版本,但你的版本更加简洁。欢呼 – Joe 2010-04-25 14:48:17
@Joe如果这个回应对你最有帮助,那么你应该通过点击左边的复选标记来接受它。 – 2010-04-25 14:50:31