共享内存的意外行为&分叉?

时间:2012-07-23 07:01:49

标签: c linux fork shared-memory

给出以下代码:

#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]发生之前将1更新为fork(),然后更新了ptr并将arr[0]更新为2值{{1}}没有?

祝你好运

2 个答案:

答案 0 :(得分:6)

父母和孩子之间不共享

arrfork之后,每个人都有不同的副本。因此,当孩子改变arr时,它不会影响父母 您的共享内存调用会影响ptr,但不会影响arr

答案 1 :(得分:-1)

数组不是指针!数组可以存储在堆栈中。检查汇编代码。