linux信号量

注意:表述有误! 请以mannul手册为准! 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

最近接触到信号量,看手册里有sem_post族函数和semop族函数,不太清楚有什么不同,于是查了一下。请看下图:

 

sem_post适用于linux线程间同步;

semop适用于linux进程间同步。

 

这篇文章不错:

http://www.ibm.com/developerworks/cn/linux/l-ipc2lin2.html#N108DB 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Updated:2012-03-15

刚才得空,查了一下Linux手册,发觉之前的理解有误。下面将linux的手册页翻译过来:

#man sem_overview

POSIX信号量允许在进程和线程间同步它们的动作。
信号量是一个不小于0的整数,对它可以进行两种操作:对信号量的值加一(sem_post);对信号量的值减一(sem_wait)。如果对一个当前值为0的信号量执行sem_wait操作,将会阻塞直到值大于0.

有两种形式的信号量:有名信号量,无名信号量。

有名信号量:
有名信号量是通过"/somename"的命名形式进行区分的。两个进程可以操作同一个信号量,只需要在sem_open时传递同样的信号量名字。
新建一个有名信号量或打开一个已存在的有名信号量,需要调用sem_open函数。信号量被打开后,可以使用sem_post,sem_wait进行操作。当一个进程不再使用信号量时,可以调用sem_close来关闭信号量。当所有的进程都不再使用信号量时,可以使用sem_unlink来清除该信号量。

无名信号量:(基于内存的信号量)
无名信号量,顾名思义没有名字,存在于某块内存区域,被多线程(线程共享型信号量)或多进程(多进程共享型信号量)共享。线程共享型信号量位于进程中能被所有线程访问的内存区域,例如全局变量。进程共享型信号量必须位于共享内存区域。
在使用之前,无名信号量必须通过sem_init来初始化,然后可以通过sem_post,sem_wait来进行操作。当信号量不再被使用时,在其所在的内存区域被销毁之前,应该使用sem_destory来销毁该信号量。

Linux 2.6之前的内核,仅支持无名、线程共享型信号量。在2.6之后的内核,并且glibc提供了NPTL线程实现的系统中,提供了完整的POSIX信号量实现。

POSIX有名信号量与内核具有相同的声明周期:不再使用有名信号量时,请调用sem_unlink进行删除,否则该信号量将一直存在,直到系统关机。

使用POSIX信号量的程序必须通过cc -lrt编译选项来连接到real-time实时库:librt。

在Linux上,有名信号量是通过虚拟文件系统来创建的,通常位于/dev/shm,以sem."somename"的形式命名。 

 

---------------------------------------------------

关于适用范围:

 

sem_post  CONFORMING TO POSIX.1-2001. 

semop      CONFORMING TO SVr4, POSIX.1-2001.    --------------->在System V和POSIX系统上都可以使用

posted @ 2012-02-09 17:46    阅读(998)  评论(0编辑  收藏  举报