如何在C语言中修改共享内存(shmget/shmat)?

5

我有一个结构体:

struct sdata {
    int x;
    int y;
    time_t time;
};

我按以下方式为结构体创建共享内存:

size_t shmsize = sizeof(struct sdata);
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666);

然后我像这样访问共享内存:

struct sdata *data = shmat(shared.shmid, (void *) 0, 0);
data->time = time(NULL); // function returns the current time

我的问题很简单。这是访问/修改共享内存的正确方式吗?这是最好的方法吗?

(我正在使用System V信号量进行同步,但我没有包含那部分代码。我只是想确保我正确地访问/修改了共享内存。)

2个回答

4
是的,这是一种创建、访问或修改共享内存的方式。 然而,您可能会遇到同步问题,可以使用Posix信号量来解决。请参见第一个sem_overview(7) man页面。

谢谢。我对同步感到满意。我只是担心执行“data->time = time(null); 或 data->x = 5”会弄乱一些东西。 - bfresh

2

这是正确的,需要注意的是您正在创建一个私有共享内存段,这意味着您必须以某种方式传输shmid给任何其他您想要使用它的进程。


1
如果另一个进程被 fork(),只要在 fork() 之前创建了共享内存,IPC_PRIVATE 就没有问题。然而,这个警告在更一般的情况下也是有效的。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接