码迷,mamicode.com
首页 > 系统相关 > 详细

关于linux信号量的SEM_UNDO标志(防止死锁)

时间:2016-07-23 07:36:58      阅读:361      评论:0      收藏:0      [点我收藏+]

标签:linux

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

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

本文重点介绍的是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.h

技术分享

sem.c

技术分享

技术分享

test.c

技术分享

技术分享


运行:


技术分享

运行1 设置sem.sem_flg为 0【终止子进程 出现死锁现象】

技术分享        运行2 设置sem.sem_flg为SEM_UNDO【终止子进程  系统自动V操作 不会出现死锁现象】

技术分享

结论:

若通过kill命令把其中一个进程杀死,且该进程还没有执行V操作释放资源。若使用SEM_UNDO标志,则操作系统将自动释放该进程持有的信号量,从而使得另外一个进程可以继续工作。若没有这个标志,另外进程将P操作永远阻塞。

因此,一般建议使用SEM_UNDO标志。


本文出自 “城市猎人” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1828983

关于linux信号量的SEM_UNDO标志(防止死锁)

标签:linux

原文地址:http://alick.blog.51cto.com/10786574/1828983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!