c - POSIX 信号量的奇怪问题

标签 c posix semaphore

有两个信号量和两个进程。 “p1sem”表示进程 1 等待此信号量,进程 2 发布该信号量。 “p2sem”做相反的事情。两个进程都将值初始化为 0(如果它们尚未创建)

因此,process1 运行两个打开和删除这两个信号量的 session 。 process2 只运行一个 session ,但应该再次调用以耗尽 process1 的下一个 session 。这是代码的样子:

过程2:

#include <semaphore.h>
#include <fcntl.h>

int main(){
   sem_t *waitSem    = sem_open("p2sem", O_CREAT, 0666, 0);
   sem_t *postSem   = sem_open("p1sem", O_CREAT, 0666, 0);

   // tic for a cycle
   sem_post(postSem); 
   sem_wait(waitSem);

   // close and exit
  sem_close(waitSem);
  sem_close(postSem);
  sem_unlink("p2sem");
  sem_unlink("p1sem");
}

进程 1:

#include <semaphore.h>
#include <fcntl.h>

int main() {
    for(int i = 0; i < 2; i++) {

        // create sems
        sem_t *waitSem    = sem_open("p1sem", O_CREAT, 0666, 0);
        sem_t *postSem   = sem_open("p2sem", O_CREAT, 0666, 0);

        // tic for a cycle
        sem_post(postSem);
        sem_wait(waitSem);

        // close and exit
        sem_close(waitSem);
        sem_close(postSem);
        sem_unlink("p2sem");
        sem_unlink("p1sem");
    }
}

为了让 process1 继续,process2 必须发布 p1sem。 process2 也是如此,只有当 process1 发布它是 p2sem 时,它才能继续。这听起来像是某种僵局,但帖子发生在等待之前,所以这应该不是问题。

当 process1 先启动然后我调用 process2 两次时,一切正常。

但是,如果 process2 首先启动,那么第一个 session 工作正常,但是当再次调用 process2 时,两个进程都会挂起。据我了解,没有理由发生这种情况。当我调试时,挂起时信号量的值对于每个进程都是相反(即 p1sem 在 process1 的值为 0 但在 process2 的值为 1。p2sem 相同。)我附上了一张图片我的 gdb(查看 __align = 以获得信号量的值,我认为较大的正数表示负 -1,即 -# 等待该信号量的进程,至少根据 http://man7.org/linux/man-pages/man3/sem_getvalue.3.html )您也可以玩通过 gdb 调用 sem_post 和 sem_wait,但你会发现无论你从哪个进程调用它,它都不会影响另一个的信号量值。

/dev/shm 包含 sem.p1sem 和 sem.p2sem。如果人们想对此进行测试,那么要重新启动该过程,您必须使用 rm sem.p1sem sem.p2sem 删除那些信号量

有人明白吗?

enter image description here

最佳答案

如果启动“proc2”然后启动“proc1”,它看起来像:

  • “proc1”被选中,因此它取消链接信号量,然后创建新信号量,
  • 然后选择“proc2”并取消链接新创建的信号量,
  • 因此,“proc2”的新实例创建了与之前信号量无关的新信号量。这由 sem_open 指定:

If a process makes repeated calls to sem_open(), with the same name argument, the same descriptor is returned for each successful call, unless sem_unlink() has been called on the semaphore in the interim.

“proc1”随后被阻塞等待任何其他进程无法访问的信号量。

关于c - POSIX 信号量的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45937822/

相关文章:

c - `int` 总是签名的吗?

c - 为什么预处理器需要大括号才能有语句?

c - 我如何确定在使用 pause() 时不会丢失信号?

c - 如何在C中使用printf和scanf处理char16_t或char32_t?

c - 越界数组和段错误

linux - 即使在 `sort` 之后, `uniq` 仍然重复一些值

regex - 为什么在使用正先行 (?=...) 时我对 regexp_matches 函数的响应为空

Java 信号量选项

java - 与信号量同步线程

c - 选择共享内存或 unix 信号量键的惯用方法