POSIX 信号量父信号量值不受影响
Posted
技术标签:
【中文标题】POSIX 信号量父信号量值不受影响【英文标题】:POSIX Semaphores parent semaphore value is unaffected 【发布时间】:2019-07-28 12:09:47 【问题描述】:我正在学习 POSIX 信号量。
编写了一个基本代码,允许在父子之间共享 POSIX 信号量。为什么子级更新后,父级的信号量值没有改变。
#include <stdio.h>
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#include <stdlib.h>
void print_sem_value(sem_t *sem)
int sem_value;
if (sem_getvalue(sem, &sem_value) != 0)
perror("sem_getvalue");
else
printf("%d:Semaphore value:%d\n", getpid(), sem_value);
int main(int argc, char *argv[])
pid_t pid;
sem_t sem;
sem_init(&sem, 1, 3);
pid = fork();
if (pid == 0)
print_sem_value(&sem);
sem_wait(&sem);
print_sem_value(&sem);
sem_wait(&sem);
print_sem_value(&sem);
else if (pid > 0)
wait(NULL);
print_sem_value(&sem);
sem_post(&sem);
print_sem_value(&sem);
sem_destroy(&sem);
return 0;
【问题讨论】:
【参考方案1】:为什么子级更新后,父级的信号量值没有改变。
您创建了一个未命名的、进程共享的信号量,该信号量适合您的目的,但您并未导致它实际被共享。作为the sem_init
manual page文件:
如果
pshared
不为零,则信号量在 进程,并且应该位于共享内存区域中(参见shm_open(
3)
、mmap(
2)
和shmget(
2)
)。
如果您不遵守这一点,那么子节点将获得自己的信号量副本,尽管它不会与父节点的进程共享状态交互。
一旦你解决了这个问题,还要注意只有一个进程应该sem_destroy()
信号量,而在你当前的代码中,两个进程(尝试)都这样做。
【讨论】:
以上是关于POSIX 信号量父信号量值不受影响的主要内容,如果未能解决你的问题,请参考以下文章
POSIX 信号量:为啥父进程在子进程释放信号量之前获取信号量?
Linux多线程_(Posix信号量实现环形队列生产者消费者模型)