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

给出以下代码:

#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

如果小孩更新了arrptr是他的块,那怎么可能呢? 意思是,父进程在fork()发生之前更新了arr[0]1 ,那么为什么发生了ptr的更新并且arr[0]更新为2值没有更新呢?

最好的祝福

家长和孩子之间不共享。
fork ,他们每个人都有不同的副本。 所以当孩子改变时,不影响父母。
你的共享内存调用影响ptr ,但不是arr

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