0

我认为我的程序应该像这样工作:1)使用 value = 0 初始化未命名的信号量,sem_init(..)的第二个值是 1,所以正如它在 MAN 中所说的那样,信号量在进程之间共享 2)创建子进程,子进程等到信号量值变为 1

父进程增加了信号量的值,所以子进程现在应该退出,但它并没有真正退出,所以这就是问题所在

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>


pid_t child;


void child_proc(sem_t* sem) {
    sem_wait(sem);
    printf("OK\n");
}

void parent_proc(sem_t* sem) {

    sem_post(sem);
    sleep(2);

    int status;
    waitpid(child, &status, 0);
}

int main(int argc, char* argv[]) {
    sem_t sem;
    sem_init(&sem, 1, 0);

    child = fork();

    if (0 == child) {
        child_proc(&sem);
        return 0;
    }

    parent_proc(&sem);
    return 0;
}
4

1 回答 1

1

问题是两个进程都有信号量结构的本地(非共享)副本,并且一个进程中的更改不会反映到另一个进程。

正如手册页所说,如果要跨进程共享信号量,不仅需要将非零值传递给 的第二个参数sem_init,而且该sem_t结构还需要存在于共享内存区域中。在您的示例程序中,它存在于堆栈中,不共享。

您可以通过使用公共文件映射 (with mmap) 或 with来共享内存shm_open,特别是。

于 2013-04-16T17:47:01.590 回答