割り当てを完了するには、 fork()
and関数を使用する必要があります。wait()
非決定論的な動作をモデル化しており、fork()
可能な遷移が複数ある場合はプログラムが必要です。
fork
どのようにそしてどのように機能するかを試してみるためにwait
、私は単純なプログラムを作成しました。親プロセスが単一の子プロセスの終了ステータスを使用して子プロセスが受け入れ状態に到達したかどうかを判断できるため、プログラムが1回だけ分岐した場合は、呼び出しがどのように機能するかを理解できたと思います。
ただし、次のコードからわかるように、複数の子プロセスが必要な状況を処理できるようにしたいと思います。私の問題は、_exit
関数を使用してステータスを設定できるのは1回だけのように見えることです。したがって、私の例のように、親プロセスがテストする終了ステータスは、最初の子プロセスが終了ステータスとして0を発行したことを示していますが、2番目の子プロセスに関する情報はありません。
私は単に_exit()
拒否を行わないようにしましたが、その子プロセスは続行され、事実上、2つの親プロセスがあるように見えます。
ワッフルについては申し訳ありませんが、親プロセスが複数の子プロセスのステータス情報を取得する方法を誰かに教えてもらえれば幸いです。または、親プロセスが子プロセスからのステータスの受け入れのみに気付くことができれば幸いです。しかし、その場合、拒否ステータスを持つ子プロセスを正常に終了する必要があります。
私のテストコードは次のとおりです。
#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;
}