有两个信号量和两个进程。 " 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删除那些信号量
有人理解这个吗?
答案 0 :(得分:2)
如果你启动“proc2”然后“proc1”,它看起来像:
sem_open
:然后如果进程重复调用sem_open(),则使用相同的名称 参数,每个成功调用返回相同的描述符,除非 sem_unlink()已在过渡期间调用信号量。
“proc1”被阻止等待任何其他进程无法访问的信号量。