我需要使用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