找回密码
 注册
关于网站域名变更的通知
查看: 307|回复: 2
打印 上一主题 下一主题

Linux进程——信号量

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-7 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

5 R& X, }# c+ l4 O& J信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:# c- x! T0 b+ G$ {8 \2 F9 Y2 N

& n: ]  j# h' y$ z(1) 测试控制该资源的信号量。
, m; t4 ~, g" p( a
6 ~! K" d4 B: z4 p(2) 若此信号量的值为正,则允许进行使用该资源。进程将进号量减1。- K  M) X5 j; o+ [7 E+ g

& Q6 c* Z/ N- i(3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。( L2 ~3 ~! C7 P0 i9 n$ c* `
* Q7 h- X$ X- |& b' h( h
(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
' D2 M: F) E" w4 O2 H* l, m" H, @+ w3 \' n/ f, W+ k# C  |
维护信号量状态的是Linux内核操作系统而不是用户进程。我们可以从头文件/usr/src/linux/include /linux /sem.h中看到内核用来维护信号量状态的各个结构的定义。信号量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是semget,用以获得一个信号量ID。5 m( F* e9 c* E* l- i8 W. M+ g2 X

) R8 ^8 X, b+ [/ X& s  c#i nclude <sys/types.h>" z& W# m; N; m7 z8 j" H# D7 L
        #i nclude <sys/ipc.h>
- l6 i3 X4 h9 H# B$ @        #i nclude <sys/sem.h>3 w7 t( L1 x3 e/ y
        int semget(key_t key, int nsems, int flag);
9 E: _" h' }. f# C! G! M& G; v/ P6 i& w; h5 a6 B/ s) j
key是前面讲过的IPC结构的关键字,它将来决定是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。/ {5 y% b% K; L9 a0 K& A
$ i4 A- c  k, n' b/ I, M! s1 \+ Z
sEMCtl函数用来对信号量进行操作。
4 f+ r" ^! B# t9 \9 ^/ g/ w2 \6 K# l7 W4 @7 {
int semctl(int semid, int semnum, int cmd, union semun arg);
8 I& [0 k8 v1 L, q" v
" H8 e2 X2 h: s, B8 x; W不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。$ S. S7 q4 _* H6 w* o% O& _, w

7 R0 o1 q3 i1 u6 ?4 Hsemop函数自动执行信号量集合上的操作数组。
2 G/ L; ?1 B4 B7 m; t. a" k1 y9 S' b7 h6 ^3 S' [3 K. I0 E9 ?3 l
int semop(int semid, struct sembuf semoparray[], size_t nops);
0 v1 E" K: x8 v2 W* P3 a& r
& c$ c) V3 h4 A6 J& N# @- W# Bsemoparray是一个指针,它指向一个信号量操作数组。nops规定该数组中操作的数量。- P: l, u0 ^2 f- D
& ~0 }. w  V# u9 T- c4 _
例:获取信号量状态:
, O% y3 s' o5 v" ^  j3 ^' E" H' g& a* c- {  a
struct semid_ds semidbuf;
  f; ^2 b- Q- ]  L; L8 C# o( L  R, U7 i+ S# l  Q4 |7 J! W
semctl(semid, 0, IPC_STAT, &semidbuf);
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-7 18:32 | 只看该作者
    Linux进程——信号量

    该用户从未签到

    3#
    发表于 2020-4-8 19:00 | 只看该作者
    Linux进程——信号量
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-26 02:06 , Processed in 0.140625 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表