当前位置: 首页 > 知识库问答 >
问题:

使用未命名信号量的进程间同步

鲜于渊
2023-03-14

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);

共有1个答案

琴刚豪
2023-03-14

一般方法会奏效。但请注意以下几点:

  • 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);
 类似资料:
  • null 更新 在OS X上,sem_init()没有按预期工作。使用sem_open()来解决这个问题。参考:http://lists.apple.com/archives/darwin-dev//2008/oct/msg00044.html

  • 问题内容: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相同的信号量吗? 另外,假设我创建了一个内部带有信号灯并分叉的结构。所有子进程仍然使用相同的信号量吗?如果不是,将struct + semaphores存储在共享内存中是否允许子进程使用相同的信号量? 我对派生的子进程如何使用相同的信号量感到非常困惑。 问题答案: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相

  • 为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?

  • 进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。比如,要重启 apache 服务,一般使用命令"service httpd restart"重启 apache的程序。 那么,可以通过直接管理进程来关闭或重启 apache 吗?答案是肯定的,这时就要依赖进程的 信号(Signal)了。我们需要给予该进程号,告诉进程我们想要让它做什么。 系统中

  • 头文件 semaphore.h sys/stat.h fcntl.h 常用函数 函数 说明 [[sem_open sem_open]] 打开一个有名信号量 [[sem_close sem_close]] 关闭一个信号量 [[sem_unlink sem_unlink]] 删除一个信号量 [[sem_post sem_post]] 【V操作】释放操作:信号量的值加1 [[sem_wait sem_w

  • 这是进程2中的代码块,它应该捕捉信号量,但没有 因此,这个想法是--这个进程2应该在另一个进程的post/wait之间获得seemaphore--此时,共享的mem段中有数据,并且不是空的。然而,相反,它在另一个进程的最后捕获信号量,这时它已经清空了sahred内存段并删除了其中的任何数据。 我做了很多问题解决,并确认a)每个进程中的信号量都是相同的信号量b)进程1在某个时候会增加信号量,然后捕获