1

ここに2つのコードサンプルがあります

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        fork();
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        return 0;
}

user@Ubuntu ~/Arena/c $ ./a
i - 1, pid - 6765, addr -0x7fffd892950c
i - 1, pid - 6766, addr -0x7fffd892950c

私の2番目のプログラムは

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        fork();
        return 0;
}

user@Ubuntu ~/Arena/c $ ./b
i - 1, pid - 6772, addr -0x7fff39120f2c

私の知る限り、フォークは親プログラムの完全なコピーを上から下に作成して実行する必要があります。その場合、呼び出しの位置がそれほどfork()大きな違いを生むのはなぜですか? printf2番目のプログラムで省略されている理由を誰かが説明できますか?

4

3 に答える 3

0

さらに啓発するには、次を試してください。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int i = 0;
    i++;
    printf("A: i - %d, pid - %d, addr -%p", i, getpid(), &i);
    fork();
    printf("\nB: i - %d, pid - %d, addr -%p\n", i, getpid(), &i);
    return 0;
}

最初のprintf()ものには改行が含まれていないため、出力はメモリに保持されます。2 番目printf()には改行が含まれているため、プログラムが分岐した後に出力が表示されます。タグ付けされた 2 つの行に同じ情報が表示されAます。タグ付けされた 2 つの行に異なる情報が表示されるはずですB

シングルスレッド アプリケーションでは、PID、親 PID、および によって返される値を除いて、親プロセスと子プロセスはほとんど同じですfork()。詳細については、 の POSIX 仕様を参照してくださいfork()

于 2013-11-05T15:35:11.880 に答える