Linux(高级编程)9————进程间通信5(信号量)

信号量是是什么?
信号量是进程间通信方式之一,用来实现进程间的同步与互斥。信号量的原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其他通信资源(如文本、外部设备等)来实现进程间通信。信号量本身不具备数据传输的功能,他只是一种外部资源的标识。
信号量的本质是:具有等待队列的计数器。
相关概念介绍:
临界资源:多个进程或线程可以共享的资源。
临界区:对临界资源进行操作的代码。
同步:访问临界资源的时序可控性。
互斥:同一时间访问临界资源的唯一性。
为了获得共享资源,进程需要执行以下步骤:
1.测试控制该资源的信号量
2.若此信号为正,当进程对信号量做减1操作时,表明它使用了一个单位的资源。
3.如此信号量的值为0,则进程进入休眠状态,直至信号量值大于0时。进程被唤醒后再执行第1步。
4.当进程不再使用该信号量控制的共享资源时,该信号值增加1.如果此时有等待此信号量的进程,则唤醒它。
注意:常用的信号量形式被称为二元信号量或双态信号量。它控制单个资源,初值为1。其实信号量初值可以为任一正值,该值说明有多少个共享资源单位可供使用。信号量是对临界资源的一种保护机制,所以对它操作是不能被打断的即原子性,而这些都是内核帮我们做好的。
信号量的操作步骤:

  • 信号量创建:
int semget(key_t key, int nsems, int semflg);

参数:
key:操作系统对该信号量的标识。
nsems:创建该信号量集合中的信号量数。
semflg:IPC_CREAT、IPC_EXCL等(创建标记)。
返回值:成功返回信号量操作句柄semid;失败返回-1,并设置errno。

  • 信号量的控制:
 int semctl(int semid, int semnum, int cmd, ...);

参数:
semid:信号量ID
semnum:只要操作的第几个信号量。
cmd:为具体所要进行的操作,常用的操作:SETVAL设置单个信号量的初值。
SETALL:设置所有信号量的初值,此时的semnum会被忽略。
IPC_RMID:删除信号量。
…:不定参数,可有可无。如:我们需要获取信号量信息时就可通过这个参数获取。

          union semun {
              int              val;               /* Value for SETVAL */
              stru
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值