为什么在任何知道其名称的进程中,线程都可以使用命名信号量?

时间:2018-08-27 01:49:58

标签: linux posix semaphore

来自APUE

  

POSIX信号灯有两种样式:已命名和未命名。他们不同   如何创建和销毁它们,但在其他方面却相同。 未命名   信号仅存在于内存中,并且要求进程有权访问内存   才能使用信号量。这意味着它们只能由   映射相同内存的相同进程或不同进程中的线程   扩展到其地址空间。相比之下,命名信号量按名称访问   并且可以在任何知道其名称的进程中供线程使用。

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

来自sem_overview的手册页:

  

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

因此,“以任何进程的线程”都可以像访问普通文件一样访问这些文件。

然后,

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

答案 1 :(得分:1)

您正在倒退思考。问题是:“如果我需要在teo 不相关进程之间同步使用共享资源,我该怎么办?”答案是“您可以给一个信号灯起一个名字,然后它就不限于在共享内存的进程中使用。”

为什么它甚至有用?好吧,用例可能并不常见-也许您从未遇到过-但它们确实存在。在不相关的进程之间共享许多资源:数据库,配置文件,串行端口,打印机队列等等。您可以在带有锁定文件的这些资源的共享使用之间进行调解,但是这很笨拙,最终您需要在每个项目上重新设计轮子。另一方面,信号量易于使用并且具有定义明确的语义记录。

但是,大多数信号灯的使用确实在共享内存的相关进程之间。而且您也不需要不必要地支付在文件系统中维护名称的开销。

因此,我们最终得到两种信号量:便宜的低开销的信号量,用于最常用的用例,以及较重的较高开销的量,可以更广泛地使用。令人高兴的是,语义和API非常相似,因此在开始使用命名信号量时,您无需学习全新的概念。