gpt4 book ai didi

c - 为什么 sem_open 在没有共享内存的情况下与 fork() 一起工作?

转载 作者:可可西里 更新时间:2023-11-01 11:46:17 30 4
gpt4 key购买 nike

这个程序可以工作(我测试过),即使信号量不在共享内存中。请注意我是如何创建变量一次的——在 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() 中持续存在,因此您可以在父级和子级中使用相同的变量来访问命名信号量。

关于c - 为什么 sem_open 在没有共享内存的情况下与 fork() 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129845/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com