进程间通信之3----信号量

1、信号量

信号量分为以下三种。
1、System V 信号量,在内核中维护,可用于进程或线程间的同步,常
   用于进程的同步。
2、Posix 有名信号量, 可用于进程或线程间的同步, 常用于线程。
3、Posix 基于内存的信号量,存放在共享内存区中,可用于进程或线程间的同步。

为了获得共享资源进程需要执行下列操作:
(1)测试控制该资源的信号量。
(2)若信号量的值为正,则进程可以使用该资源。进程信号量值减
     1,表示它使用了一个资源单位。此进程使用完共享资源后对应    
     的信号量会加 1。以便其他进程使用。
(3)若信号量的值为0,则进程进入休息状态,直至信号量值大于
     0。进程被唤醒,返回第(1)步。

函数原型:
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
int semget(key_t key,int nsems,int flag);
int semop(int semid,struct sembuf *sops,size_t num_sops);
int semctl(int semid, int semnum, int cmd, …);
  • 函数semget创建一个信号量集或访问一个已存在的信号量集。 返回值:成功时,返回一个称为信号量标识符的整数,semop 和 semctl 会使用它;出错时,返回-1。
  • 参数 key 是唯一标识一个信号量的关键字,如果为 IPC_PRIVATE(值为0,创建一个只有创建者进程才可以访问的信号量, 通常用于父子进程之间;非0值的key,表示创建一个可以被多个进程共享的信号量。
  • 参数flag是一组标志,还可以与键值IPC_CREAT按位或操作,以创建一个新的信号量。也可以通过 IPC_CREAT 和 IPC_EXCL标志的联合使用确保自己将创建出一个新的独一无二的信号量。
  • 函数 semop 用于改变信号量对象中各个信号量的状态。返回值:成功时,返回 0;失败时,返回-1.参数 semid 是由 semget 返回的信号量标识符。参数sops是指向一个结构体数组的指针。每个数组元素至少包含以下几个成员:
  • struct sembuf{
    • short sem_num; //操作信号量在信号量集合中的编号, 第一个信号量的编号是 0。
    • short sem_op; //sem_op 成员的值是信号量在一次操作中需要改变的数值。通常只会用到两个值,一个是-1, 也就是 p 操作,它等待信号量变为可用;一个是+1,也就是 v 操作,它发送信号通知信号量现在可用。
    • short sem_flg; //通常设为:SEM_UNDO,程序结束, 信号量为semop调用前的值。
  • };
  • 参数 nops为sops指向的sembuf结构体数组的大小。函数 semctl 用来直接控制信号量信息。参数 semid 是由 semget 返回的信号量标识符。参数 semnum 为集合中信号量的编号, 当要用到成组的信号量时,从0开始。一般取值为0,表示这是第一个也是唯一的一个信号量。参数cmd为执行的操作。通常为:IPC_RMID(立即删除信号集,唤醒所有被阻塞的进程)、 GETVAL(根据semun返回信号量的值,从0 开始,第一个信号量编号为0)、SETVAL(根据 semun 设定信号的值,从0开始,第一个信号量编号为0)、GETALL(获取所有信号量的值, 第二个参数为0,将所有信号的值存入semun.array中)、SETALL(将所有 semun.array的值设定到信号集中,第二个参数为 0)等。

进程间通信之3----信号量相关推荐

  1. Linux IPC进程间通信(三):信号量

    系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...

  2. linux进程间通信:POSIX信号量

    文章目录 概念描述 编程接口 注意事项 编程案例 信号量基本接口使用案例 信号量父子进程间通信 信号量实现 两进程之间通信 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质 ...

  3. 进程间通信——POSIX 有名信号量与无名信号量

    原文地址:blogof33.com/post/9/ 前言 在 POSIX 系统中,进程间通信是一个很有意思的话题. POSIX信号量进程是3种 IPC(Inter-Process Communicat ...

  4. Linux进程间通信五 Posix 信号量简介与示例

    1. 信号量简介 信号量用于进程或线程间同步,Posix信号量是一个非负整型,只有两种操作,加一(sem_post)和减一(sem_wait),如果信号量值为0,sem_wait默认阻塞. Posix ...

  5. 107. 进程间通信 - 信号灯集信号量实现进程间同步通信

    Server先执行10条语句,Client后执行10条语句,通过内核空间信号灯实现 要求Client先运行/打印语句后执行,Server后运行/打印语句先执行 信号灯的创建/初始化,有client定义 ...

  6. handler原子锁_深入Linux内核架构——锁与进程间通信

    Linux作为多任务系统,当一个进程生成的数据传输到另一个进程时,或数据由多个进程共享时,或进程必须彼此等待时,或需要协调资源的使用时,应用程序必须彼此通信. 一.控制机制 1.竞态条件 几个进程在访 ...

  7. Python中的进程间通信

    Python中的进程间通信 文章目录 Python中的进程间通信 1 进程间通信 1.1 概念 1.2进程间通信方法 各种进程间通信 1. 基于信号量(Semaphore)的IPC 2 基于信号(Si ...

  8. IPC--进程间通信四(信号量)

    这篇文章将讲述别一种进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面 ...

  9. 进程间通信系列 之 信号实例

    进程间通信系列 之 概述与对比  http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   h ...

  10. UNIX环境高级编程---进程间通信总结

    进程间通信 1 管道 匿名管道 命名管道 2 消息队列 3 信号量 POSIX信号量 有名信号量 无名信号量 有名信号量和无名信号量的公共操作 4 共享内存 5 信号 相关函数 6 套接字 针对 TC ...

最新文章

  1. lua创建文件和文件夹
  2. Discuz!NT发帖回复后没有积分动画的去除和修复方法
  3. php new对象 调用函数,关于JS中new调用函数的原理介绍
  4. Azkaban与Oozie的区别及如何调度spark任务
  5. UML在powerDesigner的使用及其相关概念
  6. 场景/故事/story——寻物者发布消息场景、寻失主发布消息场景、消息展示场景、登录网站场景...
  7. React开发(278):ant design message res保证正确信息提示
  8. 一行一个链接代码_AI最优论文+代码查找神器:966个ML任务、8500+论文任你选
  9. java用流实现复制功能_【java】IO流 实现简单的复制功能
  10. Git教程——为什么要掌握Git以及Git的安装
  11. 数据结构之链表及实现
  12. MAC机上JAVA对话框死锁的案例之一
  13. java ascii加密_Java 字符加密
  14. 服务器运行环境一般填什么,运行环境是什么意思
  15. 学计算机去一线城市,这5个“新一线”城市在线抢人,选择去这上大学非常有前景!...
  16. Gene Pattern
  17. DELL 电脑 重装系统出现 no boottable devices found
  18. git推送代码详细教程
  19. 送书【新书】 |《Git从入门到精通》
  20. 战地4稳定的服务器,战地4 游戏服务器

热门文章

  1. Windows消息传递机制详解
  2. windows操作笔记
  3. Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
  4. php程序设计简明教程
  5. Mysql基础语法DDL、DML、DQL
  6. oracle近三个月内,在oracle中的前三个月SQL
  7. python 当前时间的前一天_python中time、datetime模块的使用
  8. 10054 java,为什么Socket.Receive在远程主机断开连接时抛出SocketException(10054)?
  9. web api、获取DOM元素的方式、事件理解、click事件在移动端300ms延时、事件对象、事件委托、常见事件类型
  10. android关键应用程序,Android应用程序的四个关键点