首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSIX信号量父信号量值不受影响

POSIX信号量父信号量值不受影响
EN

Stack Overflow用户
提问于 2019-07-28 20:09:48
回答 1查看 28关注 0票数 0

我正在学习POSIX信号量。

编写了一个基本代码,允许在父级和子级之间共享POSIX信号量。为什么在子进程更新信号量后,父进程中的信号量值没有改变。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2019-07-28 20:32:45

为什么在子进程更新信号量后,父进程中的信号量值没有改变。

您创建了一个未命名的、进程共享的信号量,该信号量适合您的目的,但您并没有真正将其共享。作为the sem_init manual page文档:

如果信号量为非零,则信号量在进程之间共享,并且应该位于共享内存的区域中(请参见shm_open(3)mmap(2)

shmget(2)).

如果你不遵守这一点,那么子进程就会得到它自己的信号量副本,它不会与父进程的进程共享状态进行交互。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57240762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档