c - 共享内存和 fork 的意外行为?

标签 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);
    *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/

相关文章:

c - if-else 结构有什么问题?

c - 将可变长度字符串数组读取为整数

java - 在 Linux Box 上获取 JVM 时区

c - c 中父子之间的 sigusr1

c - c语言读文件错误

在 C 或 C++ 中将二进制字符串转换为 int

linux - 如何从后台获取标准输出?

ruby - rvm 没有设置 ruby​​ 版本

c++ - 在 windows 中替代 fork

c++ - 如何从 fork 中检索类的实例?