0

我在共享内存中有一个数组。我想使用一个指针来遍历这个数组,这也是共享的。这是我尝试过的:

    /* initialize color sequence in shared memory */
    shmkey = ftok("/dev/null",3);   /* executable name and a random number */
    shmid = shmget(shmkey, sizeof(char), 0700 | IPC_CREAT);
    if(shmid < 0){      /* shared memory error check */
        perror("shmget\n"); 
        exit(1);
    }
    queue = (char*) shmat(shmid, NULL, 0);  /* shared memory part of colorSequence */
    printf("queue allocated.\n");

    /* initialize color sequence pointer in shared memory */
    shmkey = ftok("/dev/null//",61);    /* executable name and a random number */
    shmid = shmget(shmkey, sizeof(char), 0700 | IPC_CREAT);
    if(shmid < 0){      /* shared memory error check */
        perror("shmget\n"); 
        exit(1);
    }
    p = (char*) shmat(shmid, NULL, 0);  /* pointer to queue in shared memory */
    printf("queue pointer allocated.\n");
    p = &queue[0];

现在我 fork 孩子并尝试更改值 p,但是在一个进程中所做的更改不会影响另一个进程。

if(fork() == 0){   /* child process */
    sem_wait(&sem);
    printf("   Child printing *p=%c, p=%p\n",*p,p);
    p++;
    printf("   Child printing after++ p=%c, p=%p\n",*p,p);
    sem_post(&sem);
    exit(0);
}
else{   /* parent process */
    sem_wait(&sem);
    printf("Parent printing *p=%c, p=%p\n",*p,p);
    p+=2;
    printf("Parnet printing after++ p=%c, p=%p\n",*p,p);
    p = NULL;   //even though this, program doesn't fail
    sem_post(&sem);
}

然而,输出是(队列的内容如下:RBG ...):

Parent printing           *p=R, p=0x7f5c77837000
Parnet printing after++   p=B, p=0x7f5c77837002
   Child printing         *p=R, p=0x7f5c77837000
   Child printing after++ p=G, p=0x7f5c77837001

即使应该共享指针,我也无法弄清楚为什么会得到这些结果。你能帮我解决这个问题吗?谢谢。

编辑

当我尝试在父进程中更改 p 指向的值时,从子进程打印时效果是可见的。但是递增指针不起作用。

4

1 回答 1

2

您实际上有两个问题,但操作系统缓解了一个问题。

第一个问题是您说您的共享内存大小为 1 ( sizeof(char))。操作系统会缓解这种情况,因为它会将其四舍五入到页面大小。

第二个问题是这样的:

p = (char*) shmat(shmid, NULL, 0);  /* pointer to queue in shared memory */

p = &queue[0];

在这里你p从共享内存中获取,你用另一个指针覆盖这个指针。

然而,这是一个没有实际意义的问题,原因有两个:第一个是我评论过的那个。第二个是即使您不覆盖指针p,它仍然对您的进程是“本地的”,因此这样做p++不会更改共享内存中的副本,因为实际指针未共享。如果您真的想在共享内存中有一个指针,那么您将p是一个指向指针的指针,必须(*p)++在本地和共享内存中都增加。

于 2013-05-05T01:00:41.757 回答