即使信号量不在共享内存中,此程序仍可正常运行(我对其进行了测试)。请注意我如何创建变量 - 在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");
}
答案 0 :(得分:6)
sem_open()
创建的信号量是一个命名信号量。命名信号量的基本目的是在不相关的进程之间使用。 sem_init()
创建的信号量是一个未命名的信号量。它比命名信号量重量轻,如果在相关进程之间使用,则需要放在共享内存中。如果在同一进程的线程之间使用,则可以将其保存在全局变量中。
sem_open()
返回的指针实际上是指向mmap()
映射的内存的指针,并设置了MAP_SHARED
标志。由于这种类型的内存在fork()
内持续存在,因此您可以在父级和子级中使用相同的变量来访问命名信号量。