我正在学习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;
}
答案 0 :(得分:0)
为什么子项更新后,父项中的信号量值没有更改。
您创建了一个未命名的,进程共享的信号量,该信号量适合您的目的,但实际上尚未使它共享。作为the sem_init
manual page个文档:
如果
pshared
不为零,则信号量在两个之间共享 进程,并且应位于共享内存的区域中(请参见shm_open(
3)
,mmap(
2)
和shmget(
2)
)。
如果您不坚持这样做,那么孩子将获得自己的信号量副本,尽管该副本不会与父母的过程共享状态交互。
修复此问题后,还请注意,只有一个进程sem_destroy()
会发出信号量,而在您当前的代码中,两个进程(试图这样做)都会这样做。