huyc

导航

sem_overview(7)

SEM_OVERVIEW(7) 2009-02-25

NAME
sem_overview —— POSIX信号量概述

DESCRIPTION
POSIX信号量允许进程和线程同步它们的动作。

一个信号量是一个整数,它的值永远不会降到0以下。仅能在信号量上执行两个操作:将信号量加1(sem_post(3)),将信号量减1(sem_wait(3))。如果信号量当前值为0,则sem_wait操作将阻塞,直至其值变得大于0。

POSIX信号量有两种:命名信号量和未命名信号量。

命名信号量
命名信号量需要一个这种格式的名字:/somename。亦即,一个空字符结尾的,以斜线开头,最长NAME_MAX-4(即251)个字符的字符串。在两个进程中传递相同名字给sem_open就可以操作相同的命名信号量。

函数sem_open(3)创建一个新的命名信号量或打开一个已经存在的命名信号量。打开信号量之后,可以对它进行sem_post和sem_wait操作。当进程停止使用该信号量后,调用sem_close以关闭该信号量。当所有进程都停止使用该信号量后,调用sem_unlink以将该信号量从系统中移除。

无名信号量(基于内存的信号量)
无名信号量没有名字。该信号量被放置在一块由多个线程或进程共享的内存区域内。一个线程共享的信号量被放在进程中线程共享的区域,例如,全局变量。一个进程共享的信号量必须被放在一个共享内存区内(如,semget(2)创建的System V共享内存段,或shm_open(3)创建的POSIX共享内存对象)。

一个无名信号量在使用之前需要调用sem_init(3)初始化。然后它才可以用于sem_post(3)和sem_wait(3)操作。当信号量不再需要时,应该在回收所占内存之前为它调用sem_destroy(3)。

本节的余下部分将描述一些有关Linux的POSIX信号量实现的特殊细节。

版本
在2.6内核之前,Linux只支持无名的,线程共享信号量。在Linux 2.6和带有NPTL线程实现的glibc的系统上,提供了POSIX信号量的完整实现。

持久性
POSIX命名信号量有内核的持久性:如果没有调用sem_unlink移除该信号量,则它在系统关机之前一直存在。

链接
使用POSIX信号量API的程序必须用cc -lrt编译,这样才能链接实时库librt。

通过文件系统访问命名信号量
Linux下,命名信号量被创建在一个虚拟文件系统中,一般挂载在/dev/shm下,具有名字sem.somename。(这就是信号量名字限制为NAME_MAX-4而非NAME_MAX个字符的根本原因)

Linux 2.6.19以后,ACLs可以被附加到这个目录的文件上,以控制基于用户和组的对象权限。

CONFORMING TO
POSIX.1-2001.

NOTES
System V信号量(semget(2),semop(2)等)是一个更老一些的信号量API。POSIX信号量提供比System V信号量一个简单且设计得更好的接口,但是,POSIX信号量并没有像System V信号量那样被广泛支持(尤其是老一些的系统)。

EXAMPLE
一个使用各种POSIX信号量函数的例子在sem_wait中展示。

SEE ALSO
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)

COLOPHON
This page is part of release 3.23 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.

posted on 2011-10-30 16:22  huyc  阅读(679)  评论(0编辑  收藏  举报