AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内。IPC对象指的是共享内存(share memory)、消息队列(message queue)和信号灯集(semaphore)。

信号灯(semaphore),也叫信号量。

本质;一种数据操作锁(本身是一个计数器,是对临界资源的保护),它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。

当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。当一个进程不再使用一个信号量控制的共享资源时,信号量的值+1,对信号量的值进行的增减操作为原子操作,这是由于信号量主要的作用是维护资源的互斥或多进程的同步访问。而信号量的创建以及初始化上,不能保证操作为原子操作。

使用信号量的原因:为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,它可以通过生成并使用令牌来授权,在任意时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来协调进程对共享资源的访问的。

缺点:创建和初始化分离。

信号灯是不同进程间或一个给定进程内部不同线程间同步的机制。System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。System V 信号灯由内核维护。主要函数semget,semop,semctl。

1、semget函数:创建一个信号量集对象(得到一个信号量集标识符)

函数原型:int semget(key_t key,int nsems,int semflg)

key:由ftok()函数的得到

nsems:创建信号量集中信号的个数

semflg:

IPC_CREAT:若内核中不存在键值与key相等的信号量集,则创建,否则,返回此信号量集的标识符

IPC_EXCL:单独使用无意义

IPC_CREAT | IPC_EXCL :创建一个新的信号量集并返回信号量集的标识符,否则,返回-1.

返回值:成功返回信号量集的标识符。失败返回-1.

2、semctl函数:在指定的信号集或信号集内的某个信号上执行操作控制

函数原型:int semctl(int semid,int semnum,int cmd,union semun arg)

semid: 信号量集标识符

semnum:信号量集数组上的下标,表示某一个信号量

arg:

union semun {

short val;          /*SETVAL用的值*/

struct semid_ds* buf; /*IPC_STAT、IPC_SET用的semid_ds结构*/

unsigned short* array; /*SETALL、GETALL用的数组值*/

struct seminfo *buf;   /*为控制IPC_INFO提供的缓存*/

} arg;

3、semop函数:对信号量进行P,V操作(本文的重点)

P操作负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;

V操作负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。

semop函数原型如下:

int semop(int semid, struct sembuf  *sops, unsigned nsops);

semop操作中:sembuf结构的sem_flg成员可以为0、IPC_NOWAIT、SEM_UNDO 。为SEM_UNDO时,它将使操作系统跟踪当前进程对这个信号量的修改情况,如果这个进程在没有释放该信号量的情况下终止,操作系统将自动释放该进程持有的。

sembuf结构的sem_flg成员为SEM_UNDO时,它将使操作系统跟踪当前进程对这个信号量的修改情况,如果这个进程在没有释放该信号量的情况下终止,操作系统将自动释放该进程持有的信号量,从而使另外一个进程可以继续工作,防止其他进程因为得不到信号量而发生【死锁现象】。为此一般建议使用SEM_UNDO。

测试代码:

sem.h

sem.c

semtest.c

运行结果:

linux sem函数,linux下信号量及其SEM_UNDO标志相关推荐

  1. c语言timer linux 回调函数_Linux下用C语言实现定时器

    2020-02-22 关键字:alarm().setitimer().拦截定时器信号.定时器信号有效范围 在 Linux 中实现定时器功能的比较简单且好用的系统内置的方法有两种: 1.alarm() ...

  2. linux popen 函数,Linux下使用popen()执行shell命令

    函数原型: #include "stdio.h" FILE popen( const char command, const char* mode ) 参数说明: command: ...

  3. linux io函数,Linux下普通IO文件操作函数---C语言

    普通文件io总结 file结构体 typedef struct { int level; /*填充/清空一级缓存*/ unsigned flag; /*文件状态指针*/ char fd; /*文件描述 ...

  4. linux usleep函数,linux下,测试usleep函数对CPU占用率的影响

    一.本机环境 CPU信息 Intel(R) Core(TM) i3 CPU  M 350  @ 2.27GHz Intel(R) Core(TM) i3 CPU  M 350  @ 2.27GHz I ...

  5. linux receive函数,Linux网络 - 数据包的接收过程

    的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...

  6. linux timerfd_settime函数,Linux的timerfd分析

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,所以能够被用于select/poll的应用场景. 1.使用方法 timerfd提供了如下接口供用户使用 timerfd ...

  7. linux setlocale函数,linux中的多语言环境(LC_ALL, LANG, locale)

    为了在Linux下实现多语言支持,必须在定制安装程序时,引入与glibc和图形环境两者对应的多语言环境支持.对于glibc环境而言,它是整个Linux中文化的基础,我们需要在/usr/share/lo ...

  8. linux backtrack函数,Linux调用backtrack函数打印程序崩溃时的调用堆栈

    可以给自己的程序都加上这个东西,便于快速的找到错误吧,看到别人都是这么用的 #include #include #include #include //signal 函数用法参考http://www. ...

  9. linux usleep 函数,Linux 高精確的時序(sleep, usleep,nanosleep)

    首先, 我会说不保证你在使用者模式 (user-mode) 中执行的行程 (process) 能够精确地控制时序因为 Linux 是个多工的作业环境. 你在执行中的行程 (process) 随时会因为 ...

最新文章

  1. 【GCN】图卷积网络 Graph Convolutional Networks
  2. 终于,Geoffrey Hinton那篇备受关注的Capsule论文公开了
  3. 新学期的一些安排 | 以及一些小建议
  4. 在windows下安装flex和bison、GCC
  5. 实战|利用机器学习解决一个多分类任务
  6. C#赋值运算符及解析
  7. 标准make变量 MAKE_VERSION, CURDIR
  8. 结合vue、react、angular谈谈MVC、MVP、MVVM框架
  9. 【HDU - 5922】Minimum’s Revenge(思维,最小生成树变形)
  10. leetcode197. 上升的温度(SQL)
  11. 怎么才能显示Eclipse中ConSole的全部输出内容
  12. uploadify动态改变参数
  13. 弥补Web开发缺陷实战 HTML5 中存储API
  14. 无人车研发实力哪家强?Google只能排第十
  15. 技术篇-HBase Coprocessor 的实现与应用
  16. sql mysql 删除数据库_如何清除SQL数据库中的数据?
  17. 最强抓包神器 Fiddler 手机抓包详解
  18. 爬虫案例1:js逆向获取极简壁纸的高清壁纸
  19. TC气象数据下载包括NCEP的FNL(python脚本)、STI的Best_track、NOAA的SST
  20. JavaScript经典pdf书籍推荐

热门文章

  1. 裁员之后人手却不够,马斯克和母亲只好亲自上阵帮忙了
  2. 这个十八线品牌火了!直言后置三摄里有两个摄像头是装饰用的
  3. 索尼发布Xperia 8手机:采用骁龙630处理器
  4. 拼多多、微博等在新一轮经济变化中将做出更大贡献
  5. 新iPhone又被各个品牌玩坏了,这里的人个个都是人才,说话又好听…
  6. 小米MIX 4 Pro“老底”被掀了,看完很激动!
  7. 三大运营商移动电话用户总数公布了 同比增长6.2%
  8. 扎克伯格拒绝参加加拿大议会 或因藐视罪名被拘留
  9. “生而强悍” vivo iQOO官宣3月1日发布
  10. 终于!华为Mate 9已获安卓9.0正式版更新