DESCRIPTION
POSIX 信号量允许进程间和线程间同步他们的操作. 一个信号量是一个整型(integer),其值不能小于0. 信号量允许2中操作:给信号量的值加1(sem_post); 给信号量的值减一(sem_wait).
如果信号量的值为0, 那么sem_wait() 函数将会阻塞, 直到信号量的值大于0才会解除阻塞. POSIX 信号量有两种形式: 有名信号量 和 无名信号量.
Named semaphores
一个有名信号量有一个唯一的名字, 名字的格式是 /somename; 名字是以NULL结尾的字符串,最大长度不超过NAME_MAX-4 (减4的原因见Accessing named semaphores via the filesystem) 个字节(包括最前面的斜线),
除了首个字节是斜线外,之后的任何字节都不能是斜线.
两个进程可以通过给 sem_open()函数传递相同名字来达到操作同一个信号量的目的.
函数sem_open() 可以创建一个新的有名的信号量 或者 打开一个既存的有名信号量. 信号量被打开后, 就可以使用函数 sem_post() 和 sem_wait() 来操作它.
当一个进程使用完了这个信号量后,他可以使用函数 sem_close() 来关闭这个信号量.
当所有的进程都不再使用这个信号量时,可以调用函数 sem_unlink() 将这个信号量从系统中删除.
Unnamed semaphores (memory-based semaphores)
无名信号量没有名字, 作为代替有名的方法,无名信号量被放置于一个多线程共享的内存区域中(线程共享的信号量) 或者多个进程共享的内存区域中(进程共享的信号量).
线程共享的信号量被放置于一个进程之内的多线程共享内存区,例如全局变量.
进程共享信号量必须被放置于共享内存中(例如使用shm_open()创建的共享内存对象).
在使用无名信号量之前, 必须使用函数 sem_init() 初始化这个无名信号量, 随后才可以使用 sem_post() 和 sem_wait() 来操作这个无名信号量.
当无名信号量不在使用时, 并且信号量所在的内存区域没有被释放, 使用 sem_destroy() 来删除这个无名信号量.
Versions
在linux内核2.6版本之前, Linux只支持无名,线程共享的信号量. 从Linux 内核 2.6版本起 ,glibc提供了NPTL线程实现, 完整的POSXI信号量被提供了.
Persistence(持续性)
信号量是随内核持续的: 如果不调用sem_unlink进行删除, 信号量会一直持续到系统关闭.
Linking
编译时需要链接pthread库.
Accessing named semaphores via the filesystem
在Linux上, 有名信号量时在虚拟文件系统中创建的, 通常挂载在目录 /dev/shm 下, 名字的形式是 sem.somename (信号量名字长度是 NAME_MAX-4 的原因)。
从Linux内核2.6.19版本起, Linux支持使用访问控制列表(ACLs) 来控制虚拟文件系统中对象的权限.
Inherit
CONFORMING TO
POSIX.1-2001.
NOTES
System V 的信号量是过时的, POSIX信号量提供了使用更简单、设计更合理的API.
POSIX信号量