<semaphore.h>
和<sys/sem.h>
中包含的功能有何不同?
是否存在使用标题或其他标题更好的情况?
答案 0 :(得分:14)
<sys/sem.h>
提供XSI(最初是Unix System V)信号量的接口。这些不是基本POSIX标准的一部分(它们在XSI选项中主要用于传统的Unix兼容性),虽然它们不被认为是过时/已弃用,但许多程序员认为它们已弃用,POSIX建议:
申请使用
POSIX实时扩展为进程间通信定义了备用接口。需要使用IPC的应用程序开发人员应该设计他们的应用程序,以便可以轻松修改使用XSI进程间通信中描述的IPC例程的模块以使用备用接口。
XSI信号量的优点和缺点是它们是,并且必须是由于它们的接口工作方式,内核空间对象。这给您带来的主要好处是能够设置它们,以便内核可以在进程退出或意外终止时退出操作。主要成本是每个操作都是内核空间的往返,即它们非常慢。使用它们的接口也非常迟钝且难以学习,它们必然是一个进程共享资源,这意味着您必须处理共享命名空间和资源清理问题。
<semaphore.h>
定义了POSIX信号量,它们的设计方式完全可以在用户空间中实现,除非在进程调用内核进入休眠状态的竞争情况下。它们的性能应该接近最佳(即几乎不可能打败你自己的),但它们并不像XSI信号量那样具有特色。 POSIX信号量还为您提供了选择是否需要进程本地信号量(用于多线程环境,甚至在某些情况下,在单线程程序中使用信号处理程序)或进程共享信号量,在后一种情况下,您还可以选择是让系统处理按名称在共享命名空间中分配它,还是自己获取共享内存并在共享内存中初始化它。
答案 1 :(得分:4)
它们彼此不同/替换,但是两种不同的实现并提供不同的功能集。 semaphore.h
是posix实现,sys/sem.h
是sysV的实现。 POSIX considered更轻,用途广泛。