linux进程间通信-信号量

引入信号量之前,先介绍几个概念:

1.临界资源:同一时刻只允许一个进程或线程访问的资源。(有时候是有限个进程或线程访问),就比如一支笔一次只能是一个人使用。
这里的临界资源在c语言或c++中的表现就是从代码段开始,一直到堆区的这一部分,我们将其称之为临界资源,对于每一个进程,都有各自独立的栈,所以进程之间栈不是共享的,除了栈以外的代码段,数据段,只读数据段,堆区这几个内存结构可以说是一个程序中不同进程间的临界资源。

2.临界区:访问临界资源的代码段,也就是说该代码执行后会去访问临界资源。它可以是一个硬件,也可以是一个软件。

3.原子操作:指的是不可被分割,不能被打断的操作。在我们的代码段,将代码转换为指令保存起来,一条指令的执行肯定不会被打断,不然就会出错。而如果不想被打断,那这里面做了什么,加入了哪些操作,才能使得好几个操作合成一个原子操作?

4.信号量
它本身不具备数据交换的功能,而是通过控制其他的通信资源来实现进程间通信的。它是一种外部资源的标识,只能取正整数,并且它自身的加一减一过程是原子操作。如果信号量的值为0,再进行减一时会阻塞。

信号量方法:
semget():创建一个信号量,或者获取一个已有的信号量
如果是第一次创建时,需要对该信号量赋权限。
semop():完成对信号量值的修改,(+1,-1操作)
semctl():对信号量做控制,可以为信号量赋初始值,也可以删除信号量。
信号量是由内核做控制的,它不属于某一个进程,我们在使用时只是查找它的接口,再进行使用。
semget();
返回一个int型,获取失败,则返回-1。其中有三个参数:信号量名称,信号量的个数,权限。具体的使用可以用man命令来查找。
semop():
返回值这里同上,参数为:信号量id,信号量个数,设置初始值命令,等。
semop();
返回值这里同上,参数为:信号量id,一个结构体变量,信号量的个数。
在这个结构体变量中对其进行p操作和v操作。
销毁信号量:
销毁的是信号量所在的集合,通常在建立信号量时,先移除再创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值