给出以下代码:
#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
是他的块,那怎么可能呢? 意思是,父进程在fork()
发生之前更新了arr[0]
为1
,那么为什么发生了ptr
的更新并且arr[0]
更新为2
值没有更新呢?
最好的祝福
家长和孩子之间不共享。
fork
,他们每个人都有不同的副本。 所以当孩子改变时,不影响父母。
你的共享内存调用影响ptr
,但不是arr
。
数组不是指针! 数组可能被存储在堆栈中。 检查汇编代码。