Linux:信号量

本文详细介绍了Linux环境下的信号量,包括二进制和整型信号量的分类,重点阐述了二进制信号量的工作原理。通过实例展示了如何使用信号量实现进程间的同步与互斥,如显示器保护和父子进程成对输出。此外,文章还探讨了SEM_UNDO标志的含义,解释了其在进程异常退出时如何实现资源的回滚操作,以防止进程饥饿问题。
摘要由CSDN通过智能技术生成

接下来我将围绕着以下三点,对信号量的知识做出相应的总结,希望能够为大家带来帮助:

  • 编写信号量代码,实现二元信号量对显示器进行保护
  • 实现父子进程输出成对AA或BB
  • 调研SEM_UNDO标志代表什么含义,用途是什么,如何做到回滚

信号量

信号量:有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码完成了。那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码的首末端,确认这些信号量VI引用的是初始创建的信号量。

信号量的分类

二进制信号量(binary semaphone): 只允许信号量取0或1值,其同时只能被一个线程获取。

整型信号量(integer semaphone):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。

记录型信号量(record semaphone):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。

信号量的工作原理

这里主要讨论的是二进制信号量的工作原理。
信号量是一个特殊的变量,程序对它防问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作,二进制的信号变量只能取0和1的变量。
P(sv): 如果sv的值大于0,就给它减1;如果它的值为0,就挂起该进程的执行。
V(sv): 如果有其他进程因等待sv而挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给他加1。
创建一个信号量

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
  1. 参数:
    key:所创建或打开信号量集的键值。
    nsems:创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效。
    semflg:调用函数的操作类型,也可用于设置信号量集的访问权限,两者通过or表示
  2. 返回值:
    如果成功,则返回信号量集的IPC标识符。
    如果失败,则返回-1,errno被设定成以下的某个值

删除一个信号量

#include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/sem.h>
 int semctl(int semid, int semnum, int cmd, ...);
  1. 功能:
    控制信号量的信息。 返回值:成功返回0,失败返回-1;
  2. 参数:
    _semid 信号量的标志码(ID),也就是semget()函数的返回值;
    _semnum, 操作信号在信号集中的编号。从0开始。
    _cmd 命令,表示要进行的操作。删除操作时cmd设置成为IPC_RMID

semctl() 在 semid 标识的信号量集上,或者该集合的第 semnum 个信号量上执行 cmd 指定的 控制命令。(信号量集合索引起始于零。)根据 cmd 不同,这个函数有三个或四个参数。当有 四个参数时,第四个参数的类型是 un

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值