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
请确保最终释放共享内存对象,因为这些对象将在程序终止后继续存在。另见