代码之家  ›  专栏  ›  技术社区  ›  md.jamal

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

  •  0
  • md.jamal  · 技术社区  · 5 年前

    我正在学习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 回复  |  直到 5 年前
        1
  •  0
  •   John Bollinger    5 年前

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

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

    如果 pshared 为非零,则信号量在 进程,并且应该位于共享内存区域中(请参阅 shm_open( ) , mmap( 2 ,和 shmget( 2 ).

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

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