2

次のコードを考えると:

#include <sys/types.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
    int arr[100];
    int shmid  = shmget(IPC_PRIVATE, sizeof(int), 0600);
    int *ptr = shmat(shmid, NULL, 0);
    *ptr = 42;
    arr[0] = 1;

    if (fork())
    {
        wait(NULL);
        printf("%d, %d\n",arr[0],*ptr);
    }

    else
    {
        arr[0] = 2;
        *ptr = 1337;
    }
    return 0;
}

出力は次のとおり1,1337です。

質問: なぜそうではないの2,1337ですか?

arr子供が自分のブロックを更新し、ブロックを更新した場合、それはどのようになるptrでしょうか? つまり、親プロセスが が発生する前に更新さarr[0]れたのに、なぜ の更新が行われ、 の値への更新が行われなかったのでしょうか?1fork()ptrarr[0]2

よろしくお願いします

4

2 に答える 2

6

arr親と子の間で共有されません。
fork、それらのそれぞれはそれの異なるコピーを持っています。したがって、子が変更arrされても、親には影響しません。
共有メモリ呼び出しはに影響しますが、影響はありptrませんarr

于 2012-07-23T07:15:57.507 に答える
-1

配列はポインタではありません! 配列はスタックに格納できます。アセンブリ コードを確認します。

于 2012-07-23T07:11:02.750 に答える