gpt4 book ai didi

c - POSIX 信号量父信号量值不受影响

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:15 24 4
gpt4 key购买 nike

我正在学习 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;
}

最佳答案

Why is the semaphore value not changed in parent after child updates it.

你创建了一个未命名的、进程共享的信号量,它适合你的目的,但你并没有真正让它被共享。作为the sem_init manual page文件:

If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory (see shm_open(3), mmap(2), and shmget(2)).

如果您不遵守这一点,则子级将获得自己的信号量副本,尽管该副本不会与父级的进程共享状态交互。

一旦你解决了这个问题,还要注意只有一个进程应该 sem_destroy() 信号量,而在你当前的代码中,两个进程(尝试)都应该这样做。

关于c - POSIX 信号量父信号量值不受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57240762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com