本文介绍了为什么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
");
}

推荐答案

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

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

这篇关于为什么sem_open在没有共享内存的情况下使用fork()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 16:14