POSIX信号量的奇怪问题

时间:2017-08-29 11:19:56

标签: c posix semaphore

有两个信号量和两个进程。 " p1sem"表示process1等待此信号量,process2发布该信号量。 " p2sem"反其道而行之。两个进程都将值初始化为0(如果它们尚未创建)

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

过程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首先启动,那么第一个会话工作正常,但是当再次调用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

1 个答案:

答案 0 :(得分:2)

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

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

如果进程重复调用sem_open(),则使用相同的名称   参数,每个成功调用返回相同的描述符,除非        sem_unlink()已在过渡期间调用信号量。

然后

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