2

値が子プロセスによってどのように返され、誰に返されるのかわかりません。

出力は 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; 
}
4

4 に答える 4

5

主なプロセス:

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; 
于 2012-12-13T07:16:26.277 に答える
1

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()

于 2012-12-13T07:33:48.240 に答える
1
if(fork()) 

子プロセスを作成します。各プロセスは、var. fork親プロセスでゼロ以外の値を返します。そのためif、親プロセスに対してのみ実行されます。wait親プロセスに対してのみ呼び出されます。子プロセスが実行を完了するのを待ちます。

子プロセスvalはそれを印刷して返します。親プロセスが戻ると、 をインクリメントしてさらに実行しvar、その値を出力してから、 から戻りmain()ます。

于 2012-12-13T07:15:18.713 に答える