【问题标题】:POSIX Semaphores parent semaphore value is unaffectedPOSIX 信号量父信号量值不受影响
【发布时间】: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;
}

【问题讨论】:

    标签: c linux posix ipc semaphore


    【解决方案1】:

    为什么子级更新后,父级的信号量值没有改变。

    您创建了一个未命名的、进程共享的信号量,该信号量适合您的目的,但您并未导致它实际被共享。作为the sem_init manual page文件:

    如果pshared 不为零,则信号量在 进程,并且应该位于共享内存区域中(参见 shm_open(3)mmap(2)shmget(2))。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2020-12-23
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      相关资源
      最近更新 更多