【问题标题】:How to modify shared memory (shmget/shmat) in C?如何在 C 中修改共享内存(shmget/shmat)?
【发布时间】:2012-04-01 19:10:48
【问题描述】:

我有一个结构:

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 信号量进行同步,我没有包含该代码。我只是想确保我正在正确访问/修改共享内存。)

【问题讨论】:

    标签: c struct shared-memory


    【解决方案1】:

    是的,这是一种创建、然后访问或修改共享内存的方法。 但是,您可能有同步问题,您可以使用例如Posix 信号量。请参阅第一个 sem_overview(7) 手册页。

    【讨论】:

    • 谢谢。我对同步很好。我只是担心做“data->time = time(null); or data->x = 5”会搞砸一些事情。
    【解决方案2】:

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

    【讨论】:

    • 如果其他进程是fork()ed,那么只要在fork()之前创建共享内存,IPC_PRIVATE就没有问题。不过,该警告在更一般的情况下是有效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2014-02-14
    • 1970-01-01
    • 2021-05-11
    • 2012-10-26
    相关资源
    最近更新 更多