【问题标题】:Why does sem_open work with fork() without shared memory?为什么 sem_open 可以在没有共享内存的情况下与 fork() 一起使用?
【发布时间】:2017-11-18 07:54:32
【问题描述】:

这个程序可以工作(我测试过),即使信号量不在共享内存中。请注意我是如何在 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");
}

【问题讨论】:

    标签: c linux semaphore


    【解决方案1】:

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

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

    【讨论】:

    • 但是为什么使用相同的变量起作用 - 请注意,我在两个分叉进程中使用相同的变量,而不是为每个进程单独调用 sem_open()
    • 因为有问题的变量是在fork之前由sem_open设置的指针。指针、它的内容(即信号量的地址)和它指向的共享内存内容(信号量)通过fork 继承。
    猜你喜欢
    • 2021-12-04
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2017-02-16
    • 1970-01-01
    • 2012-04-26
    • 2010-12-30
    相关资源
    最近更新 更多