进程间通信之信号量

一、信号量

信号量有两种,一种的有名信号,一种是无名信号。有名信号一般用于进程间同步,无名信号一般用于于线程间同步。创建或打开一个信号的函数:

name 参数致命信号量的名字,由于信号量内部保存在系统内核中,多个进程间可以直接通过指定信号量的名字来相互通信。 oflag 表示信号的属性:可读、可写、可执行或者其他,如果指定了 O_CREAT 属性,则会创建信号量,否则表示打开已有信号量。后面的可选参数有两个:

  1. mode: 信号量的权限,和文件属性一样,0755 或者其他。
  2. value: 默认值,信号量内部维持了一个计数,value 就是设置计数的默认值。

操作信号量的方法:

wait 表示等待一个信号量,当信号量中的计数不为 0 时,会把计数减 1,然后继续执行后面的逻辑,如果计数为 0,wait 操作就会阻塞,直到计数不为 0 。 trywait 是 wait 的非阻塞版本,它会尝试 wait,如果计数为 0 也直接返回。 post 操作会把计数加 1,它和 wait 相对。只有通过它把计数加 1 后,阻塞的信号量才最继续往下执行。

关闭信号量:

close 用于关闭信号量,这个操作会导致信号量的引用计数减 1 。当引用计数到达 0 后,执行过 unlink 的信号量会自动删除。

信号量的主要应用场景是同步,适合同步多个进程的状态同事到达某一个点。

二、示例代码

示例代码中创建了两个进程,每个进程都对一个变量执行三次自加操作。信号量的作用就是保证两个进程对变量自加操作的进度相同 (意思是你自加了 1 次,我也自加 1 次,不存在你自加 2 次我才自加 1 次的情况) 。

执行结果:

可以看到,两个进程间的字节都是交替进行的。

发表评论