首页 > 代码库 > Linux中IPC信号量的使用

Linux中IPC信号量的使用

信号量是用来解决进程间的同步与互斥问题的一种进程间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(P/V操作)。其中,信号量对应于某一种资源,取一个非负的整形值。信号量值(常用sem_id表示)指的是当前可用的该资源的数量,若等于0则意味着目前没有可用的资源。

PV原子操作(很重要的)

   PV原子操作的具体定义如下:(好好理解,很重要的啊)

   ●  P操作:如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。

   ●  V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。

   常见的使用信号量访问临界区的伪代码如下图1:

  图1中的非临界区和临界区在咱们这里就是代码,具体这张图的理解还要结合着后面的实验才能理解。

  最简单的信号量只能取0和1值,这种信号量叫做二维信号量,在本节中,主要讨论二维信号量。二维信号量学好了,比较容易扩展到使用多维信号量的情况。

信号量编程

函数说明

   在Linux系统中,使用信号量通常分为以下4个步骤:

   ①  创建信号量或获得在系统中已存在的信号量,此时需要调用 semget() 函数。不同进程通过使用同一个信号量键值来获得同一个信号量。

   ②  初始化信号量,此时使用 semctl() 函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。

   ③  进行信号量的PV操作,此时,调用 semop()函数。这一步是实现进程间的同步和互斥的核心工作部分。

   ④  如果不需要信号量,则从系统中删除它,此时使用semctl()函数的 IPC_RMID操作。需要注意的是,在程序中不应该出现对已经被删除的信号量的操作。

函数格式

技术分享

技术分享

技术分享

代码示例:

技术分享

技术分享

技术分享

技术分享

 

Linux中IPC信号量的使用