【问题标题】:Unexpected behavior with shared memory & forking?共享内存和分叉的意外行为?
【发布时间】:2012-07-21 09:50:59
【问题描述】:

给定以下代码:

#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呢?

最好的问候

【问题讨论】:

标签: c linux fork shared-memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    arr 不在父子之间共享。
    fork 之后,他们每个人都有不同的副本。所以当孩子更改arr时,不会影响到父母。
    您的共享内存调用会影响ptr,但不会影响arr

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2013-06-11
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多