名称

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放在此目录下的文件上,以基于每个用户和每个组控制对象权限。

另外参见

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)

备注

System V信号量(semget(2),semop(2)等)是较旧的信号量API。 POSIX信号量比System V信号量提供更简单,更好的设计接口。另一方面,POSIX信号量(特别是在较旧的系统上)不如System V信号量广泛可用。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

示例

sem_wait(3)中显示了使用各种POSIX信号量函数的示例。

SEM_OVERVIEW - Linux手册页

Linux程序员手册 第7部分
更新日期: 2020-06-09

日期:2019-08-20 18:02:01 来源:oir作者:oir