POSIX信号量

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信号量

时间: 2024-10-05 13:18:59

POSIX信号量的相关文章

Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post 有名信号量 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <semaphore.h> sem_t *sem_open(co

Linux互斥与同步应用(四):posix信号量的互斥与同步

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 在前面讲共享内存的IPC时曾说共享内存本身不具备同步机制,如果要实现同步需要使用信号量等手段来实现之,现在我们就来说说使用posix的信号量来实现posix多进程共享内存的同步.其实信号量也可以使用在同一进程的不同线程之间. 信号量是一个包含非负整数的变量,有两个原子操作,wait和post,也可以说是P操作和V操作,P操作将信号量减一,V操作

Linux环境编程之同步(四):Posix信号量

信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识:Posix基于内存的信号量,存放在共享内存区中:System V信号量,在内核中维护.这三种信号量都可用于进程间或线程间的同步. 图1 由两个进程使用的一个二值信号量 图2 由两个进程使用的一个Posix有名二值信号量 图3 由一个进程内的两个线程共享的基于内存的信号量 一个进程可以在某个信号量上执行的三种操作: 1.创建一个信号量,这要求调用者指定初始值,对

POSIX信号量与互斥锁

POSIX信号量相关函数: sem_open sem_close sem_unlink sem_init sem_destroy sem_wait sem_post POSIX互斥锁 pthread_mutex_init pthreaad_mutex_lock pthread_mutex_unlock pthread_mutex_destroy 自旋锁 自旋锁类似于互斥锁,它的性能比互斥锁更高. 自旋锁与互斥锁很重要的一个区别在于,线程在申请自旋锁的时候,线程不会被挂起,它处于忙等待的状态. p

linux Posix 信号量 二

一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共享内存区中(基于内存的信号量则必须在创建时指定成是否在进程间共享,且在所有进程的共享内存区,具有随进程的持续性) Posix信号量不必在内核中维护(System V信号量由内核维护),由可能为路径名的名字来标识. (Posix信号量更常用于进程间同步,互斥锁常用于线程间同步) 2.基本操作: 1. 

Posix 信号量

http://blog.csdn.net/sicofield/article/details/10897091 1.引言 信号量是包含一个非负整型变量,并且带有两个原子操作wait 和signal.wait 还可以被称为down.P 或lock,signal 还可以被称为up.V.unlock 或post.在Uinx的API中用的是wait和post. 如果信号量的非负整形变量S大于零,wait就将其减1,如果S 等于0,wait 就将调用线程阻塞.对于signal 操作,如果有线程在信号量上阻

linux进程间通信之Posix 信号量用法详解代码举例

Posix信号量不同于System V信号量的信号量集,Posix信号量是单一的信号量,分为有名信号量和无名信号量.Posix有名信号量是使用Posix IPC名字标示的信号量,可用于进程和线程间的同步:Posix无名信号量是指基于内存的信号量,存放在共享内存区中,用于进程与线程间的同步. Posix有名信号量可以是内核维护,也可以在文件系统中维护,这取决于信号量对应的路径名是否映射到了真正的磁盘文件上,如果有映射到则在文件系统中维护,否则在内核中维护,Posix有名信号量由函数sem_open

linux c编程:Posix信号量

POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉的文件系统操作. POSIX信号量删除时的处理更加合理.XSI信号量被删除后,使用该信号量标识符的操作将会出错返回,并将errno设置为EIDRM.而对于POSIX信号量,操作可以继续正常执行,直到对该信号量的最后一个引用被释放. POSIX信号量有两种形式可供选用:有名和无名.它们的区别在于,如何

linux Posix 信号量

信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识:Posix基于内存的信号量,存放在共享内存区中:System V信号量,在内核中维护.这三种信号量都可用于进程间或线程间的同步. 图1 由两个进程使用的一个二值信号量 图2 由两个进程使用的一个Posix有名二值信号量 图3 由一个进程内的两个线程共享的基于内存的信号量 一个进程可以在某个信号量上执行的三种操作: 1.创建一个信号量,这要求调用者指定初始值,对