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

时间:2019-07-28 12:09:47

标签: c linux posix ipc semaphore

我正在学习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 个答案:

答案 0 :(得分:0)

  

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

您创建了一个未命名的,进程共享的信号量,该信号量适合您的目的,但实际上尚未使它共享。作为the sem_init manual page个文档:

  

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

如果您不坚持这样做,那么孩子将获得自己的信号量副本,尽管该副本不会与父母的过程共享状态交互。

修复此问题后,还请注意,只有一个进程sem_destroy()会发出信号量,而在您当前的代码中,两个进程(试图这样做)都会这样做。