Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]
Posted
技术标签:
【中文标题】Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]【英文标题】:Sem_post() not working correctly that is neither its increasing the value of semaphore nor unblocking the process attached to that semaphore [duplicate] 【发布时间】:2019-02-05 10:25:27 【问题描述】:sem_post() 不能正常工作,这既不是增加信号量的值,也不是解除对附加到该信号量阻塞队列的进程的阻塞
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
sem_t pa,ch;
sem_init(&pa,1,1);
sem_init(&ch,1,0);
pid_t p1;
p1 = fork();
if(p1>0) //Parent process
while(1)
sem_wait(&pa);
printf("Parent\n");
sem_post(&ch);
else if(p1==0)
while(1)
sem_wait(&ch);
printf("child\n");
sem_post(&pa);
else
printf("\nError\n");
return 0;
预期的输出是
Parent
child
Parent
child
Parent
child
.. and so on..
实际输出是
Parent
【问题讨论】:
请评论您的代码 【参考方案1】:引用man sem_init
:
int sem_init(sem_t *sem, int pshared, unsigned int value);
如果
pshared
是非零,则信号量在进程之间共享, 并且应该位于共享内存区域中(参见 shm_open(3), mmap(2) 和 shmget(2))。 (因为由 fork(2) 创建的孩子继承 其父的内存映射,它也可以访问信号量。)任何 可以访问共享内存区域的进程可以在 使用 sem_post(3)、sem_wait(3) 等的信号量。
您的信号量不在共享内存中,因此分叉的子进程将看不到父进程中所做的任何更改(反之亦然)。因此,两个进程都会陷入死锁。
【讨论】:
以上是关于Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]的主要内容,如果未能解决你的问题,请参考以下文章