给出以下代码:
#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
?
如果 child 更新了 arr
并且 ptr
是他的 block ,那怎么可能呢?意思是,父进程在fork()
发生之前将arr[0]
更新为1
,那么为什么要更新 ptr
发生了,而 arr[0]
的值没有更新为 2
?
最诚挚的问候
最佳答案
arr
不在父级和子级之间共享。
在fork
之后,他们每个人都有一个不同的副本。因此,当子级更改 arr
时,不会影响父级。
您的共享内存调用会影响 ptr
,但不会影响 arr
。
关于c - 共享内存和 fork 的意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11607814/