02-概述
53.1 概述
SUSv3规定了两种类型的POSIX信号量。
- 命名信号量:这种信号量拥有一个名字。通过使用相同的名字调用sem_open(),不相关的进程能够访问同一个信号量。
- 未命名信号量:这种信号量没有名字,相反,它位于内存中一个预先商定的位置处。未命名信号量可以在进程之间或一组线程之间共享。当在进程之间共享时,信号量必须位于一个共享内存区域中(System V、POSIX或mmap())。当在线程之间共享时,信号量可以位于被这些线程共享的一块内存区域中(如在堆上或在一个全局变量中)。
POSIX信号量的运作方式与System V信号量类似,即POSIX信号量是一个整数,其值是不能小于0的。如果一个进程试图将一个信号量的值减小到小于0,那么取决于所使用的函数,调用会阻塞或返回一个表明当前无法执行相应操作的错误。
一些系统并没有完整地实现POSIX信号量,一个典型的约束是只支持未命名线程共享的信号量。在Linux 2.4上也是同样的情况;只有在Linux 2.6以及带NPTL的glibc上,完整的POSIX信号量实现才可用。
在带NPTL的Linux 2.6上,信号量操作(递增和递减)是使用futex(2)系统调用来实现的。