c – 为什么sem_open在没有共享内存的情况下使用fork()?

即使信号量不在共享内存中,该程序也可以(我测试过).请注意我如何创建变量 – 在fork()之前.

另一方面,使用sem_init()创建的信号量需要在共享内存中才能工作.但它仍然是一个sem_t结构,为什么它不需要共享内存?

sem_t结构的内容是否有所不同?

sem_t *s = sem_open("mysemaphore1", O_CREAT, 0600, 0);
if (fork()) {
    sleep(3);
    sem_post(s);
} else {
    sem_wait(s);
    printf("Woke\n");
}

解决方法:

sem_open()创建的信号量是一个命名信号量.命名信号量的基本目的是在不相关的进程之间使用. sem_init()创建的信号量是一个未命名的信号量.它比命名信号量重量轻,如果在相关进程之间使用,则需要放在共享内存中.如果在同一进程的线程之间使用,则可以将其保存在全局变量中.

sem_open()返回的指针实际上是指向由mmap()映射的内存的指针,并设置了MAP_SHARED标志.由于这种类型的内存在fork()中持续存在,因此您可以在父级和子级中使用相同的变量来访问命名的信号量.

上一篇:POSIX信号量:为什么父进程会在子进程发布之前获取信号量?


下一篇:并发编程 Semaphore的使用和详解