【问题标题】:synchronization between processes using unnamed semaphores使用未命名信号量的进程之间的同步
【发布时间】:2015-05-27 08:22:12
【问题描述】:

process-1 我正在尝试将数据写入共享内存。同时在process-2 我正在从同一个共享内存中读取数据。在这种情况下,我需要在这两个进程之间提供同步。如果我将通过未命名的信号量(使用shm_init(),mmap()),它会工作吗?

我写过这样的代码,行不行?

fd = shm_open("shm_name", O_CREAT| O_RDWR, S_IRUSR | S_IWUSR);

sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,MAP_SHARED , fd, 0);

sem_init(sema, 1, 1);

【问题讨论】:

  • sem_init afaik 适用于线程。

标签: c posix ipc shared-memory semaphore


【解决方案1】:

一般方法会起作用。但请注意以下几点:

  • shm_open(3)name 参数应以斜杠开头。改为传递"/shm_name"。 (在带有 glibc 的 Linux 上,它恰好可以在没有斜杠 IIRC 的情况下工作。)
  • 您需要使用ftruncate(2) 调整fd 的大小,否则当您尝试访问共享内存时会得到SIGBUS。每当您 mmap(2) 一个文件时,您在映射中访问的任何内存都必须实际存在于文件中,并且 POSIX 共享内存对象的工作方式相同。 (在 Linux 上,它们被实现为 /dev/shm 下的文件,它使用内存中的 tmpfs。)
  • 如果您计划使用信号量来同步共享内存映射上的操作,那么为信号量创建单独的共享内存映射是多余的。将其作为您正在同步操作的映射的一部分。

对于后者,你可以做例如以下:

typedef struct Shared_mem {
    sem_t sem;
    int shared_data[100];
} Shared_mem;

...

shared_mem = mmap(NULL, sizeof(Shared_mem), PROT_READ | PROT_WRITE,
                  MAP_SHARED, fd, 0);

...

sem_init(&shared_mem->sem, 1, 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2015-04-13
    • 2023-01-29
    • 1970-01-01
    相关资源
    最近更新 更多