进程间通信-信号量
1、为什么要使用信号量
一个执行线程访问代码的关键部分(关键部分是访问关键部分的代码),以防止多个程序同时访问一个共享资源所带来的一系列问题也就是说,信号是用于调整对进程共享资源的访问的信号,由信号来实现。
2 .信号量机制
信号信号只能通过两种操作等待信号发送,所以他们是p(SV )操作,v )操作。
p ) sv )操作:如果sv的值大于0 .则减去1,如果sv的值为0则中止工艺的执行。
v ) sv )操作:等待sv,如果其他进程挂起,则恢复运行;如果没有进程等待,则加1。
举个例子
两个过程共享信号量sv,一个过程执行p(sv )操作时,可以获得信号量,进入临界区域,使sv减少1。 第二个过程将被阻止进入临界区域
在尝试运行p(sv )时,sv将变为0,并且挂起以等待第一个进程运行远离临界区域的p(sv )以释放信号量,而第二个进程可以重新开始运行。
3、Linux信号量机制
Linux提供了一组为操作信号而精心设置的信号接口。 所有这些函数都用于操作组的信号量,并在sys/sem.h中声明。
4、信号量使用
(1)建立信号量
semget函数创建信号偏移或访问现有信号偏移intsemget(key_Tkey,intnsem,intoflag )
返回值是semop和semctl函数使用的称为信号标识符的整数。 信号标志成功。 -1失败
key:来自ftok ()函数。
nsem:创建的信号量数量
oflag:
IPC _ creat :如果内核中不存在键值等于key的信号偏移,则创建该信号偏移;如果不存在,则返回该信号偏移的标识符
单独使用IPC_EXCL:是没有意义的
IPC_CREAT | IPC_EXCL :创建新的信号量,并返回信号量的标识符。 否则返回-1。
(2)打开信号(完成对信号的PV操作) ) ) ) ) )。
在semget中打开一个信号后,对一个或多个信号的操作在semop中执行。 intsemop(intsemid,structsembuf*opsptr,size_tnops ) ) ) ) ) ) ) ) )。
semid:信号量集标识符
nsops:操作信号量的个数、即sops结构变量的个数需要为1以上.
opspt:是一个指针,指向由表示结构structsembuf{的sembuf结构表示的信号操作数组
shortsem_num; //除非使用一系列信号量,否则为0
shortsem_op; //信号量在一次操作中应该改变的数据通常为两个数,
//一个为-1,即p (待机)操作,一个为1,即v (发送)操作)
shortsem_flg; //通常为SEM_UNDO,当操作系统跟踪信号且进程在不释放信号量的情况下退出时,
//OS释放信号量
(;
对于操作信号量(semop ),flg可以设置SEM_UNDO标志; SEM_UNDO用于在进程成功结束(退出或主运行完成)或异常结束(段异常、0异常除外)时将已修改的信号大小返回给信号,例如接收到技能信号。 进程在SEM_UNDO中操作后; 如果该过程未结束,则可以改变信号的值;如果该过程结束,则将修改后的值返回到信号,信号变为原始值。
(3)对指定信号集或信号集中的某个信号进行操作的intsemctl(intsemid、intsemnum、intcmd、unionsemunarg ) ) )。
semid:信号量集标识符
semnum:信号偏移数组的下标表示一个信号
第四个参数是可选的,取决于第一个信号(操作对象)
参数cmd指定以下10个命令之一,并在semid指定的信号集合中运行:
IPC_STAT读取信号偏移的数据结构semid_ds,并将其存储在semun的buf参数中。
IPC_SET设置信号量数据结构semid_ds的元素ipc_perm,其值来自semun的buf参数。
IPC_RMID从内存中删除信号量集。
GETALL用于读取信号量集中所有信号量的值。
GETNCNT返回正在等待资源的进程数。
GETPID返回执行semop操作的最后一个进程的PID。
GETVAL返回信号量集中各个信号量的值。
GETZCNT返回正在等待完全空闲资源的进程数。
设置SETALL信号偏移中所有信号的值。
SETVAL设置信号量集中各个信号量的值。
5 .范例
译文: http://10798301.blog.51cto.com/10788301/1833721