C - 信号量未在所有进程中共享

C - Semaphore not shared over all processes

我正在做一个需要进程同步的项目。我遇到的问题是我使用的 samaphore 似乎并未在所有进程之间共享。它的行为类似于局部变量。这是一个简化的代码,但演示了同样的问题:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <semaphore.h>
#include <fcntl.h>


sem_t sem_1;    //Global variable (semaphore).

int main(){
    sem_init(&sem_1, 1, 0);     //semaphore starts with 0           
    pid_t child_pid_or_zero = fork();   //process fork
    if (child_pid_or_zero < 0){     
        perror("fork() error");
        exit (2);
    }

    if (child_pid_or_zero != 0){
        sem_wait(&sem_1);           //decrement to -1 and waits 
        printf("I am the parent %d, my child is %d.\n",getpid(),child_pid_or_zero);

    }else{

        printf("i am child\n");
        sem_post(&sem_1);       //increments
    }   
return 0;
}

父进程永远无法克服等待信号。我尝试向两个进程添加多个 sem_post() 并使用 sem_getvalue() 打印值,打印的数字似乎没有共享(每个进程都增加了自己的信号量)。

感谢您的帮助。

POSIX 非常不清楚 sem_init 的 pshared 参数(第二个参数)是如何工作的。 Linux 手册页解释得更好:

If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory

分配该内存并将信号量放在那里是您的责任。这不是系统会帮你做的。

信号量需要在一些共享内存中,而不是在文件全局区域中。

因此需要使用:shm_open()shm_get()mmap()来拥有一些共享内存。

传递给子进程的数据设置为'copyonwrite'所以当子进程调用函数时:sem_post(),数据被复制,

正如我所说,程序需要一些共享内存,并且信号量需要位于该共享内存中。