0

宿題の出力を伝えるために、このコードを作成することになっています。誰かが私を助けてくれますか?私は答えを探していませんが、これを理解する方法のステップバイステップの説明。

 int main() 
 { 
     int pid; 
     int val = 5; 

     pid = fork(); 

     if (pid == 0) val += 3; 

     if (val == 5) val++; 

     printf(“val=%d\n”, val); 
     exit(0); 
 }
4

2 に答える 2

1

コードは、次の3つのオプションのいずれかを出力します。

val = 6
val = 8
val = 6
val = 6
val = 8

これは、どちらwrite()のシステムコールが最初に完了するか(子または親)、および子プロセスが正常に作成されたかどうか(失敗する可能性があります)によって異なります。

于 2013-03-10T22:17:09.460 に答える
-1
pid = fork(); 
if (pid == 0) val += 3; 
if (val == 5) val++; 
printf(“val=%d\n”, val);

ケース 1: の後fork()、親が子より前にスケジュールされ、printf()呼び出しが正常に完了する

    val = 6;         //printed by parent
    val = 8;         //printed by child

ケース 2: の後fork()、親が子より前にスケジュールされ、正常に printf() 呼び出しが完了する

    val = 8;         //printed by child
    val = 6;         //printed by parent

printf()--との問題fork()--

#include<stdio.h>
#include <sys/types.h>

int main()
{
    printf("Before forking");
    pid_t pid = fork();

    if (pid == 0)
        printf("child printing");
    else
        printf("parent printing");
}

出力は

term# ./a.out 
Before forkingparent printingBefore forkingchild printing

上記の問題は、ステートメント「Before forking」が 2 回出力されることは明らかです。

解決策は

  1. , を使用して、呼び出し'\n'ごとに各行をバッファリングしprintf()ます。

  2. ここで適切にアドバイスされているようfflush(0)に、 fork する前にすべての I/O バッファを空にするために を呼び出します。

于 2013-03-10T22:27:20.353 に答える