SEM_OVERVIEW - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-06-09
名称
sem_overview-POSIX信号灯概述
说明
POSIX信号允许进程和线程同步其动作。
信号量是一个整数,其值永远不能低于零。可以对信号量执行两项操作:将信号量值增加1(sem_post(3));将信号量增加1。并将信号量值减一(sem_wait(3))。如果信号量的值当前为零,则sem_wait(3)操作将阻塞,直到该值大于零为止。
POSIX信号量有两种形式:命名信号量和未命名信号量。
- Named semaphores
- 命名信号量由/ somename形式的名称标识;也就是说,一个以NULL结尾的字符串,最多由NAME_MAX-4(即251个)字符组成,由一个初始斜杠组成,后跟一个或多个字符,都不是斜杠。通过将相同的名称传递给sem_open(3),两个进程可以对相同的命名信号进行操作。
- sem_open(3)函数创建一个新的命名信号量或打开一个现有的命名信号量。打开信号量后,可以使用sem_post(3)和sem_wait(3)对其进行操作。进程完成使用信号量后,可以使用sem_close(3)关闭信号量。使用信号量完成所有进程后,可以使用sem_unlink(3)将其从系统中删除。
- Unnamed semaphores (memory-based semaphores)
- 未命名的信号灯没有名称。而是将信号放置在多个线程(线程共享的信号)或进程(进程共享的信号)之间共享的内存区域中。线程共享信号灯放置在进程的线程之间共享的内存区域中,例如,全局变量。必须将进程共享的信号灯放在共享内存区域中(例如,使用shmget(2)创建的System V共享内存段,或使用shm_open(3)创建的POSIX共享内存对象)。
- 在使用前,必须使用sem_init(3)初始化未命名的信号量。然后可以使用sem_post(3)和sem_wait(3)对其进行操作。当不再需要该信号量时,并且在释放该信号量所在的内存之前,应使用sem_destroy(3)销毁该信号量。
本节的其余部分描述了POSIX信号的Linux实现的一些特定细节。
Versions
在内核2.6之前,Linux仅支持未命名的线程共享信号量。在具有Linux 2.6和提供NPTL线程实现的glibc的系统上,提供了POSIX信号量的完整实现。
Persistence
POSIX命名信号量具有内核持久性:如果不由sem_unlink(3)删除,则该信号量将存在直到系统关闭。
Linking
使用POSIX信号量API的程序必须使用cc -pthread进行编译,以链接到实时库librt。
Accessing named semaphores via the filesystem
在Linux上,命名信号量是在虚拟文件系统中创建的,通常以/ sem / sem的形式挂载在/ dev / shm下。某人。 (这是信号灯名称限制为NAME_MAX-4而不是NAME_MAX字符的原因。)
从Linux 2.6.19开始,可以将ACL放在此目录下的文件上,以基于每个用户和每个组控制对象权限。
备注
System V信号量(semget(2),semop(2)等)是较旧的信号量API。 POSIX信号量比System V信号量提供更简单,更好的设计接口。另一方面,POSIX信号量(特别是在较旧的系统上)不如System V信号量广泛可用。
示例
sem_wait(3)中显示了使用各种POSIX信号量函数的示例。
另外参见
sem_close(3),sem_destroy(3),sem_getvalue(3),sem_init(3),sem_open(3),sem_post(3),sem_unlink(3),sem_wait(3),pthreads(7),shm_overview(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。