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

C 共享内存的意外行为&;分叉?,c,linux,fork,shared-memory,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); *p

给定以下代码:

#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;
}
#包括
#包括
#包括
#包括
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())
{
等待(空);
printf(“%d,%d\n”,arr[0],*ptr);
}
其他的
{
arr[0]=2;
*ptr=1337;
}
返回0;
}
输出为:
11337

问题:为什么它不是
21337

如果孩子更新了
arr
并且
ptr
是他的区块,那怎么可能呢?也就是说,在
fork()
发生之前,父进程将
arr[0]
更新为
1
,那么为什么会发生
ptr
的更新,而
arr[0]
的值没有更新


最好的问候

数组不是指针!数组可以存储在堆栈上。检查装配代码。

arr
在父级和子级之间不共享。
fork
之后,它们每个都有一个不同的副本。因此,当子级更改arr时,不会影响父级。

共享内存调用会影响
ptr
,但不会影响
arr

请确保最终释放共享内存对象,因为这些对象将在程序终止后继续存在。另见