|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux进程间通信(7)信号量通信之semget()、sEMCtl()、semop()及其基础实验" \! f8 {; g# a% c$ C+ L: _
8 m) T/ s4 f! u7 W) \; N+ [ 这个信号量理解起来是有点不容易啊,我看书看了好几遍才知道怎么回事。在讲这一节信号量之前,我还是想先说几个小知识点,这也是我在学习完后最终理解的“精华”,哈哈!
]) a- S# A; j9 M3 m
$ K+ p/ j2 Z& c0 v5 p" S; Y信号量是干啥的?6 \% u4 d2 y4 N3 Z% m) N( F
( F3 W2 \+ h0 Q; y @
信号量就是用来解决进程间的同步与互斥问题的一种进程间通信机制。9 I0 q. C. U0 e, l# u
! o" _1 |3 \, _: ^% [( g
同步与互斥的通俗理解
; b$ W) c! Q3 n3 B( G1 t1 u* ?6 B' P' ~2 e
这两个名词咱们从字面上就能理解。举个例子吧,在创建子进程时,你是怎么保证父子进程执行的先后顺序呢?我在以前的时候是通过sleep()函数来实现的,比如我想让子进程先运行再让父进程运行,那么我就在父进程的程序中加一个sleep()函数,让父进程先睡眠,这样子就能先执行子进程了。有的时候咱们事先无法知道父进程和子进程哪一个先执行,但是要向我那样使用sleep()函数,只能保证先执行子进程,但是不能保证子进程执行完后再执行父进程,这样说能理解吧。所以如果我们想要子进程完全执行完后再执行父进程,就可以利用信号量来解决它们之间的同步问题。还不理解也没关系,我会在后面的实验中再结合实际讲。再举个更通俗的例子,一条食品生产线上,假设A、B共同完成一个食品的包装任务,A负责将食品放到盒子里,B和C负责将盒子打包。必须得是A先装食品B再打包吧,要是B不按规则先打包,那A还装啥,所以就需要一种机制方法保证A先进行B再进行,“信号量”就是这种机制方法,AB之间的关系就是同步关系;再假设打包要用到刀子,而车间就有一把刀子,这时候B和C就构成了互斥关系。; F0 B$ P# n5 x: Y
( Z. _& [9 p+ }! C# g
信号量与信号的区别
" z$ U; O4 N; Y% }" T$ q4 R* _, V1 R( V. N7 C5 y7 j. T# I
不瞒你说,我刚开始学的时候所理解的就是“信号量是很多个信号”,当然这是错误的哈!光从英语上看就不一样:信号量是 Semaphore,而信号是 Signal 。其实,信号和信号量是不同的。它们虽然都可以实现同步和互斥,但是前者是使用信号处理器来进行的,而后者是使用P,V操作来实现的。(PV操作后边有讲)
9 n/ J2 N8 X1 ^# S! j* w& {* y( A. O2 s2 }9 e. g; l
好了,进入正题。
3 q" A* k5 H0 D& g. a2 [; ^" e- o- |/ B
信号量概述; ?* Y; k/ d7 H( C
* c9 p' m1 ^/ y& _6 I/ K r _, W" m4 ~6 p3 `
8 \; D1 \, \8 k6 ?; N9 S
+ s% @8 l( a& ?; H- w
4 O; B6 z j l4 t/ |/ w+ M
+ F* `) T+ r1 F4 c: B( w5 s, `; l l3 a; e2 |$ v/ U( I
; _6 g3 O& E6 ^ |
|