C 如何防止某个特定进程一直占用信号量

C 如何防止某个特定进程一直占用信号量,c,fork,semaphore,C,Fork,Semaphore,所以我有一个共享内存,这个共享内存由主进程和用户进程访问。主进程启动并分叉用户进程(后面是exec)。所有流程都需要相互通信。这就是应该发生的事情: user process n gets semaphore write some msg in shared memory master process gets semaphore reads this msg does something user process n gets semaphore writes some msg in sha

所以我有一个共享内存,这个共享内存由主进程和用户进程访问。主进程启动并分叉用户进程(后面是exec)。所有流程都需要相互通信。这就是应该发生的事情:

user process n gets semaphore write some msg in shared memory 
master process gets semaphore reads this msg does something
user process n gets semaphore writes some msg in shared memory 
master process gets semaphore reads this msg does something
现在发生的是:

user process 1 writes something in shared msg 
user process 2 gets semaphore 
user process 3 gets sempahore but msg is meant for master (There is a bit in shared memory which will not allow the user processes to read messages meant for master)
master process gets semaphore reads msg does something, empties shared msg
master process gets semaphore, nothing in shared msg
master process gets semaphore,nothing in shared msg
因此,基本上主进程和用户进程应该是交替的,但不知何故,这种交替非常少,大多数时候,当oss或用户进程sem_发布信号量时,它会立即将其收回

有人有更好的方法吗?
我曾考虑使用msg_send和msg_receive来代替操作系统信号量,但老实说,我离这个项目太远了,要改变一切需要花费大量的工作


有没有办法确保信号量只由特定的PID使用?

为什么您认为它应该交替使用?也许先使用
yeild
,为什么会出现问题?如果处理应该是这样交替的,那么需要设计同步对象的用法来实现这样的模式。一般来说,任何等待同一对象的代码都是为了做同样的事情而等待的,而您并不真正关心哪个执行线程实际执行了该操作。例如,您不能使用一个信号量来让两个线程做两件不同的事情。嗯,也许你可以,但这比仅仅使用两个信号量要困难得多。所有的事情都是在一个线程中完成的。简而言之,我根本不使用线程。它应该替换的原因是,只有当oss从用户进程读取共享消息时,程序才会进一步移动。如果oss抓取信号量,然后释放并再次抓取,则程序将不会进一步移动。与用户进程相同。