Linux中IPC信号量的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中IPC信号量的使用相关的知识,希望对你有一定的参考价值。
PV原子操作(很重要的)
PV原子操作的具体定义如下:(好好理解,很重要的啊)
● P操作:如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
● V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。
图1中的非临界区和临界区在咱们这里就是代码,具体这张图的理解还要结合着后面的实验才能理解。
最简单的信号量只能取0和1值,这种信号量叫做二维信号量,在本节中,主要讨论二维信号量。二维信号量学好了,比较容易扩展到使用多维信号量的情况。
信号量编程
函数说明
在Linux系统中,使用信号量通常分为以下4个步骤:
① 创建信号量或获得在系统中已存在的信号量,此时需要调用 semget() 函数。不同进程通过使用同一个信号量键值来获得同一个信号量。
② 初始化信号量,此时使用 semctl() 函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。
③ 进行信号量的PV操作,此时,调用 semop()函数。这一步是实现进程间的同步和互斥的核心工作部分。
④ 如果不需要信号量,则从系统中删除它,此时使用semctl()函数的 IPC_RMID操作。需要注意的是,在程序中不应该出现对已经被删除的信号量的操作。
函数格式
代码示例:
以上是关于Linux中IPC信号量的使用的主要内容,如果未能解决你的问题,请参考以下文章