Linux 为什么任何进程中的线程都可以使用已命名的信号量?

Linux 为什么任何进程中的线程都可以使用已命名的信号量?,linux,posix,semaphore,Linux,Posix,Semaphore,来自APUE POSIX信号量有两种类型:命名和未命名。它们不同 它们是如何被创造和毁灭的,但在其他方面是一样的未命名 信号量仅存在于内存中,并且要求进程能够访问内存 能够使用信号灯。这意味着它们只能由中的线程使用 映射相同内存的相同进程或不同进程中的线程 扩展到它们的地址空间命名信号量,与之相反,是通过名称访问的 并且可以被任何进程中知道名称的线程使用 “未命名信号量”只能由中的线程使用 映射相同内存的相同进程或不同进程中的线程 扩展到它们的地址空间”,因为“未命名的信号量仅存在于内存中” 在

来自APUE

POSIX信号量有两种类型:命名和未命名。它们不同 它们是如何被创造和毁灭的,但在其他方面是一样的未命名 信号量仅存在于内存中,并且要求进程能够访问内存 能够使用信号灯。这意味着它们只能由中的线程使用 映射相同内存的相同进程或不同进程中的线程 扩展到它们的地址空间命名信号量,与之相反,是通过名称访问的 并且可以被任何进程中知道名称的线程使用

“未命名信号量”只能由中的线程使用 映射相同内存的相同进程或不同进程中的线程 扩展到它们的地址空间”,因为“未命名的信号量仅存在于内存中”

在任何知道命名信号量名称的进程中,命名信号量可以被线程使用的原因是什么

谢谢。

来自以下手册页:

在Linux上,命名信号量是在虚拟文件系统中创建的, 通常安装在/dev/shm下,名称的形式为sem.somename

因此,“任何进程中的线程”都可以访问这些文件,其方式与普通文件类似


pthread库可以将这些文件映射到内存

你在想这个问题。问题是:“如果我需要在不相关的进程之间同步共享资源的使用,我该怎么做?”答案是“你可以给信号量一个名称,然后它就不限于在共享内存的进程中使用。”

这为什么有用呢?嗯,用例可能并不常见——也许你从未遇到过——但它们确实存在。有许多资源在不相关的进程之间共享:数据库、配置文件、串行端口、打印机队列等等。您可以通过锁定文件在这些资源的共享使用之间进行调解,但这很麻烦,最终会在每个项目上重新发明轮子。另一方面,信号量易于使用,并且具有定义良好的文档化语义

然而,大多数信号量的使用实际上是在共享内存的相关进程之间进行的。而且,您不会希望为在文件系统中维护名称而不必要地支付开销


因此,我们最终得到了两种信号量:廉价的低开销信号量,用于最频繁的用例,以及更广泛使用的高开销信号量。好在语义和API非常相似,所以当您开始使用命名信号量时,不需要学习一整套新的概念。

原因是什么?嗯,因为这就是他们设计的工作原理,因为这是一个有用的功能?如果你读过我的帖子,你可能已经知道我问了什么。