値が子プロセスによってどのように返され、誰に返されるのかわかりません。
出力は 6, 7 です。質問のソース: http://www.cs.utexas.edu/~mwalfish/classes/s11-cs372h/hw/sol1.html
Program 1:
main()
{
val = 5;
if(fork())
wait(&val);
val++;
printf("%d\n", val);
return val;
}
値が子プロセスによってどのように返され、誰に返されるのかわかりません。
出力は 6, 7 です。質問のソース: http://www.cs.utexas.edu/~mwalfish/classes/s11-cs372h/hw/sol1.html
Program 1:
main()
{
val = 5;
if(fork())
wait(&val);
val++;
printf("%d\n", val);
return val;
}
主なプロセス:
val = 5;
wait(&val); // wait until child finishes
子プロセス:
val++; // val becomes 6
printf("%d\n", val); // prints 6
return val; // return val back to main process
主なプロセス:
wait(&val); // val becomes 6
val++; // val becomes 7
printf("%d\n", val); // prints 7
return val;
Afork()は基本的に新しいプロセスを作成します。これは、現在のすべての値がコピーされることを意味します。valこれはまた、親プロセスでは子プロセスではないと結論付けていvalます。これが、何らかの方法で子プロセスと通信する必要がある理由です。これは、 を使用して行いますwait。
親プロセス | 子プロセス
-------------------------------|---------------------- -----
メイン() |
{ | ########################
int 値 = 5; | | // int val = 親.val;
** int tmp = fork(); | | ** int tmp = 0;
if(tmp) // 真 | if(tmp) // false
待ちます(&val); | | // 待機を使用しない
// まで待機 | 値++; // 値 = 6
// 子プロセス | printf("%d\n", val);
// 戻り値。| | 戻り値; // 6 を返す
// リターンを保存 | ##########|############
// val の値 <---------------+
値++; // 値 = 7 | ##########################
printf("%d\n", val); | | ########################
戻り値; | | ########################
}
Linux でプロセスが終了するたびに、戻り値が一時的に保存されます。親プロセスがこの保存された値を取得しない限り、子プロセスは依然としてゾンビとしてリストされます。この値は で取得できますwait。したがって、呼び出し元でreturn <value>アプリケーションの最後に使用すると、この戻り値が返されます。wait()
if(fork())
子プロセスを作成します。各プロセスは、var. fork親プロセスでゼロ以外の値を返します。そのためif、親プロセスに対してのみ実行されます。wait親プロセスに対してのみ呼び出されます。子プロセスが実行を完了するのを待ちます。
子プロセスvalはそれを印刷して返します。親プロセスが戻ると、 をインクリメントしてさらに実行しvar、その値を出力してから、 から戻りmain()ます。