信号量

信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

1、特点
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

支持信号量组

函数原型

1 #include <sys/sem.h>2 // 创建或获取一个信号量组:若成功返回信号量集ID,失败返回-13 int semget(key_t key, int num_sems, int sem_flags);4 // 对信号量组进行操作,改变信号量的值:成功返回0,失败返回-15 int semop(int semid, struct sembuf semoparray[], size_t numops);  6 // 控制信号量的相关信息7 int semctl(int semid, int sem_num, int cmd, ...);
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include<stdlib.h>//int semop(int semid, struct sembuf *sops, size_t nsops);
//int semget(key_t key, int nse:ms, int semflg);
//int semctl(int semid, int semnum, int cmd, ...);union semun {int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};void pGetkey(int id)
{struct sembuf set;set.sem_num=0;set.sem_op=-1;set.sem_flg=SEM_UNDO;if(semop(id,&set,1)==-1){perror("semop");exit(EXIT_FAILURE);}
}void vPutBackkey(int id)
{struct sembuf set;set.sem_num=0;set.sem_op=1;set.sem_flg=SEM_UNDO;if(semop(id,&set,1)==-1){perror("semop");exit(EXIT_FAILURE);}
}int main(int argc,char **argv)
{key_t key;key=ftok(".",1);if(key==-1){printf("key=%x\n",key);}int semid=semget(key,1,IPC_CREAT|0666);if(semid==-1){printf("semget failed\n");}union semun initsem;initsem.val=0;int ret=semctl(semid,0,SETVAL,initsem);if(ret==-1){printf("semctl success\n");}pid_t pid;pid=fork();if(pid>0){pGetkey(semid);     printf("this is father\n");vPutBackkey(semid);semctl(semid,1,IPC_RMID);}else if(pid==0){printf("this is child\n");vPutBackkey(semid);}else{printf("failed\n");       }
}

信号量 ——什么是信号量相关推荐

  1. linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用

    [摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...

  2. 操作系统(三)| 进程同步详解(主要任务、制约关系、临界资源、临界区、同步机制遵循规则、信号量机制、信号量的应用)

    文章目录 进程的同步基本概念 进程同步的主要任务 进程间的制约关系 临界资源 临界区 同步机制应遵循的规则 信号量机制 整型信号量 记录型信号量 ❤❤❤ AND型信号量 信号量的应用 实现进程互斥 实 ...

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

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

  4. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  5. Linux信号量之用户态信号量(Posix信号量->无名信号量)

    相关API: 1.初始化信号量 int sem_init(sem_t* sem,int pshared,unsigned int value); //pshared为信号量最多由几个进程共享.Linu ...

  6. Linux信号量之内核信号量

    一.内核信号量 Linux内核的信号量在概念和原理上与用户态的System V的IPC机制信号量是一样的,但是它绝不可能在内核之外使用,它是一种睡眠锁. 如果有一个任务想要获得已经被占用的信号量时,信 ...

  7. 有名信号量sem_open和内存信号量sem_init创建信号量的区别

    有名信号量sem_open和内存信号量sem_init创建信号量的区别 分类: C/C++ sem_t *sem sem_open(const char *name, int oflag, .../* ...

  8. FreeRTOS信号量---二值信号量

    信号量可以用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量.计算型信号量.互斥信号量和递归互斥信号量. 0x01 二值信号量 二值信号量其实就是一个只有一个队列项的队列,这个特殊的 ...

  9. 互斥信号量和二进制信号量

    互斥信号量和二进制信号量的区别        互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效.同一个任务可以递归申请. 二进制信号量,一个任务申请成功后,可以由另一个任务释放. 二 ...

  10. 【学习笔记】第二章——信号量机制 用信号量实现互斥、同步

    文章目录 一. 信号量机制 整型信号量 记录型信号量 例子: 总结 二. 用信号量实现互斥.同步 互斥 同步 前驱 总结 一. 信号量机制 信号量:一个用于表示系统中某种资源的数量的变量(整数 or ...

最新文章

  1. 用ssh建立机器之间的信任机制
  2. 数据库集群和高可用解决方案
  3. 72 Zabbix邮件告警
  4. STM32 基础系列教程 42 - SDMMC+Fatfs
  5. 百度和360的关键词提交查询
  6. 程序员的能力拓展模型
  7. Java 并发:第三部分 - 同步锁
  8. _id随机的 es_es 的数据操作
  9. 如何CLASSPATH下的resource.properties文件进行读写操作?
  10. Halcon深度学习预训练网络模型
  11. 二分图完全匹配算法之匈牙利算法
  12. 【高项】第6章 项目进度管理【知识点精华笔记】
  13. 郭继孚:预约在城市交通中的应用——北京市回龙观地区实践
  14. VBA--类模块学习
  15. 拉普拉斯修正学习笔记
  16. POG个体成长模型:痛苦是成长的起点
  17. 决策树(三)--完整总结(ID3,C4.5,CART,剪枝,替代)
  18. 黑猴子的家:Scala Case语句的中置(缀)表达式
  19. cs无限僵尸服务器,CS1.6僵尸版
  20. 【PHP】随机生成名字

热门文章

  1. 推进700M产业链成熟,打响5G专网应用第一枪
  2. 内网安全之:Exchange 服务器安全
  3. Vue + ccropper.js裁切图片(vue-cropper)
  4. 配置allure生成精美测试报告
  5. 王者客服信息服务器,王者荣耀客服反馈在哪 客服反馈入口位置介绍
  6. 剑指offer:圆圈中最后剩下的数
  7. Maya 2017 outliner大纲视图未过滤出多余的set_huadingjin_新浪博客
  8. [CentOS Python系列] 一.阿里云服务器安装部署及第一个Python爬虫代码实现
  9. 【框架】SpringMVC
  10. 手把手教你TestComplete_图文转换OCR示例二