★什么是信号量

为了防止出现多个程序同时访问一个共享数据资源而引发的问题,需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区。信号量就可以提供这样一种访问机制。 信号量的本质是一种数据操作锁,是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步功能。

★信号量的工作原理

信号量能够进行的两种操作分别是:等待信号P(sv)和发送信号V(sv)
   ☆P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就将该进程挂起;

☆V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1。

★Linux的信号量机制

Linux提供的信号量接口有:

☆semget函数

int semget(key_t key, int num_sems, int sem_flags);

作   用:创建一个新信号量或取得一个已有信号量;

参   数:key是键值,它要与已有的键值进行比较,已有的键值指在内核中已存在的其它信号量集合的键值;

num_sems指定需要的信号量数目,它的值几乎总是1;

sem_flags是一组标志,当想要当信号量不存在时创建一个新的信号量。IPC_CREAT | IPC_EXCL可以                          创建一个新的、唯一的信号量,如果信号量已存在,返回一个错误。

返回值:如果成功,则返回信号量集合的IPC识别号;如果为-1,则出现错误;

☆semop函数

int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);

作   用:改变信号量的值;

参   数:sem_id是由semget返回的信号量标识符;

num_sem_ops是说我们仅仅执行了一个操作;

sem_opa参数指向类型为sembuf的一个数组,这个结构在/inclide/linux/sem.h 中声明:

struct sembuf{  
    short sem_num; /* 在数组中信号量的索引值 */ 
    short sem_op;  /* 信号量操作值(正数、负数或0) */。  
    short sem_flg; /* 操作标志,通常为SEM_UNDO*/ 
}; 

「SEM_UNDO」当操作信号量(semop)时,sem_flg可以设置SEM_UNDO标识;SEM_UNDO用于将修改的信号           量值在进程正常退出(调用exit退出或main执行完)或异常退出(如段异常、除0异常、收到KILL信号等)时              归还给信号量,从而使另外一个进程可以继续工作,防止其他进程因为得不到信号量而发生“死锁现象”。                  为此一 般建议使用SEM_UNDO。

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

返回值:如果所有的操作都执行,则成功返回0;如果为-1,则出错。

☆semctl函数

int semctl(int semid,int semnum, int cmd, union semun arg);

作   用:控制信号量信息;

参   数:cmd参数表示在集合上执行的命令(通常为SETVAL(用联合体中val成员的值设置信号量集合中单个信号量的值)或者IPC_RMID(从内核中删除信号量集合))

arg参数的类型为semun,这个特殊的联合体在 include/linux/sem.h中声明:

union semun{
 int val;                /* value for SETVAL */
 struct semid_ds *buf;   /* buffer for IPC_STAT & IPC_SET */
 ushort *array;          /* array for GETALL & SETALL */
 struct seminfo *__buf;  /* buffer for IPC_INFO */
 void *__pad;
};

★使用信号量进行通信

☆comm.h

☆comm.c

☆test_sem.c

☆运行结果:

☆分析:

因为每个程序都在其进入临界区后和离开临界区前打印一个字符,所以每个字符是成对出现的。

Linux进程间通信(信号量)相关推荐

  1. linux 进程间通信-信号量(semagpore)

    linux 信号量是一种IPC(Inter-Process Communication)进程间通信,它是System V semagpore ,是一种计数器:代笔了进程对资源的占用和释放:它的实现机制 ...

  2. Linux 进程间通信 - 信号量

    0. 前言    进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程 ...

  3. Linux进程间通信—信号量

    二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...

  4. Linux进程间通信信号量

    在多进程的编程环境,进程往往需要共享某些资源,比如共享内存,文件.在多个进程同时对这些共享资源操作时候,可能会引起冲突.为了更好的控制对资源的访问,linux提供了一种成为信号量的机制,首先要认识到P ...

  5. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()...

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

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

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

  7. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  8. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  9. Linux环境进程间通信 信号量

    信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制.相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志.除了用于访问控制外,还可用于进程 ...

  10. Linux进程间通信(管道、消息队列、共享内存、信号、信号量)

    目录 Linux进程间通信概述 1.管道 无名管道(pipe) 有名管道(fifo) 2.消息队列(msg) 消息队列的通信原理 消息队列相关api 消息队列收发数据 键值生成 消息队列移除 3.共享 ...

最新文章

  1. 操作系统读写者问题实验报告_操作系统知识点总结
  2. 革新Transformer!清华大学提出全新Autoformer骨干网络
  3. 至简至美-ATtiny0 跑的一个游戏
  4. Python+Appium自动化测试之toast定位
  5. 1.1计算机系统简介
  6. wifi一阵一阵卡_家里wifi总是过一会就卡一下然后又好了
  7. 关于缓存雪崩\穿透\击穿等一些问题
  8. Android windowSoftInputMode属性解析
  9. VS2019-写opengl时Bugs合集(持续更新)
  10. 调用咏南中间件插件演示
  11. 浅谈C++类(5)--友元
  12. C语言中输入输出格式控制
  13. presume_presume是什么意思_presume中文意思_presume英译汉_英汉词典
  14. 计算机音乐组获奖作品,大学生计算机音乐创作类决赛揭晓 浙音6件作品均获奖...
  15. c语言输出数组时输出的乱七八糟
  16. C语言RSA大数运算库,[转载]RSA大数运算库  c++实现
  17. google v8 实战 -- 构建v8
  18. mysql通过idb文件,恢复数据库
  19. 一步步教你创建自己的数字货币(代币)进行ICO
  20. 不同大小硬盘对拷oracle,如何实现硬盘对拷_大小不一样的硬盘怎么实现对拷?_不同大小硬盘对拷...

热门文章

  1. 使用负载均衡SLB时为何出现请求分布不均衡的现象
  2. 计算机基础0018,自学考试计算机用基础 0018复习资料.doc
  3. redis 命令别名_redis 命令、命令行根据前缀(通配符)批量删除redis存储的key
  4. python类继承实例_python类继承与子类实例初始化用法分析
  5. python 线程超时设置_python多任务之总结——(二)线程、协程
  6. Java函数式编程整理
  7. virtualenvwrapper
  8. vue 路由传参 params 与 query两种方式的区别
  9. 详解 equals() 方法和 hashCode() 方法
  10. 媒体查询Media Queries详解