多进程间通信学习之信号灯集(信号量数组)

  • 信号灯集(信号量数组):
  • 1、实现进程同步的机制
  • 2、在一个信号灯集中,可以有很多信号灯;
  • 3、这些信号灯集中的信号灯相互独立,每个灯的值的改变都不会影响到其他的信号灯;
  • 4、信号灯的值一般设置为二值量,即0或者1,其中0代表没有资源,1代表有资源
  • 常用的接口函数:
  • 一、创建一个信号灯集(semget函数):
	#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);/*参数:key:键值IPC_PRIVATE  keynsems:信号灯集合中信号灯的个数semflag:创建的标志位IPC_CREAT|0666 或 IPC_CREAT|IPC_EXCL|0666返回值:成功 semid失败 -1  重置错误码*/
  • 二、控制信号灯集(semctl函数):
	#include <sys/sem.h>int semctl(int semid, int semnum, int cmd, ...);/*参数:semid信号灯集的IDsenum:信号灯的编号 从0开始cmd:命令码SETVAL:设置信号灯的值 --->第四个参数val选项GETVAL:获取信号灯的值 --->不需要第四个参数IPC_STAT:获取信号灯集的属性--->第四个参数buf选项IPC_SET :设置信号灯集的属性--->第四个参数buf选项IPC_RMID:第二参数被忽略,第4个参数不用填写 @...:可变参返回值:成功:GETVAL:成功返回信号灯的值其余的命令码成功返回0失败 -1  重置错误码*/union semun{int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */};
  • 三、操作信号灯集中信号灯(semop函数):
	#include <sys/sem.h>int semop(int semid, struct sembuf *sops, size_t nsops);/*参数:semid:信号灯集的编号sops:操作方式struct sembuf{unsigned short sem_num; //信号灯的编号short sem_op; //操作方式(PV)-1:P操作,申请资源 1:V操作,释放资源short sem_flg; //操作的标志位 0:阻塞 IPC_NOWAIT:非阻塞方式操作}nsops:本次操作信号灯的个数返回值:成功 0失败 -1  重置错误码*/
  • 自定义封装信号灯集函数:
  • 自定义头文件:
	#ifndef __SEM_H__#define __SEM_H__int sem_init(int nsems);    //信号灯集中信号灯的个数int sem_wait_P(int semid,int sem_num);//信号灯集的编号,信号灯的编号int sem_post_V(int semid,int sem_num);int sem_exit(int semid);#endif
  • 源码文件:
	#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <unistd.h>#include "sem.h"#include <errno.h>union semun {int val;    //设置信号灯的值struct semid_ds *buf;   //信号灯集的属性};/*struct sembuf{unsigned short sem_num; //信号灯的编号short sem_op; //操作方式(PV)-1:P操作,申请资源 1:V操作,释放资源short sem_flg; //操作的标志位 0:阻塞 IPC_NOWAIT:非阻塞方式操作}*/int sem_init(int nsems)   //信号灯集中信号灯的个数{int semid = 0;key_t key = ftok("/home/linux/work", 'K');if(-1 == key){perror("ftok error");exit(-1);}//创建信号灯集/*当使用IPC_EXCL选项时,如果共享资源已经存在,则创建操作将失败并返回-1。这个选项主要用于确保在创建共享资源时不会发生冲突。*/if(-1 == (semid = semget(key,nsems,IPC_CREAT|IPC_EXCL|0666))) {if(EEXIST == errno){if(-1 == (semid = semget(key,nsems,IPC_CREAT|0666))){perror("semget error");exit(-1);}return semid;}else{perror("semget error");exit(-1);}}//初始化信号灯集union semun myval = {.val = 1};if(-1 == semctl(semid,0,SETVAL,myval)){perror("semctl error");exit(-1);}myval.val = 0;for(int i = 1; i < nsems; i++){if(-1 == semctl(semid,i,SETVAL,myval)){perror("semctl error");exit(-1);}}return semid;}//获取资源int sem_wait_P(int semid,int sem_num)//信号灯集的编号,信号灯的编号{struct sembuf mysem;mysem.sem_num = sem_num;mysem.sem_op = -1;mysem.sem_flg = 0;if(-1 == semop(semid,&mysem,1)){perror("semop error");exit(-1);}}//释放资源int sem_post_V(int semid,int sem_num){struct sembuf mysem;mysem.sem_num = sem_num;mysem.sem_op = 1;mysem.sem_flg = 0;if(-1 == semop(semid,&mysem,1)){perror("semop error");exit(-1);}}//销毁信号灯集int sem_exit(int semid){if(-1 == semctl(semid,0,IPC_RMID)){perror("semctl error");exit(-1);}}
  • 使用信号灯集实现共享内存的同步:
  • 写端:
	#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <unistd.h>#include "sem.h"#include <errno.h>#define PIGE_SIZE 4*1024int main(int argc, char const *argv[]){key_t key = ftok("/home/linux/work", 'K');if(-1 == key){perror("ftok error");exit(-1);}//创建共享内存int shmid = shmget(key,2*PIGE_SIZE,IPC_CREAT|0666);if(-1 == shmid){perror("shmget error");exit(-1);}//映射共享内存char *k_addr = shmat(shmid,NULL,0);if((void *)-1 == k_addr){perror("shmat error");exit(-1);}//创建信号灯集int semid = sem_init(2);//向共享内存中写入数据while(1){sem_wait_P(semid,0); //申请0号灯资源fgets(k_addr,128,stdin);k_addr[strlen(k_addr)-1] = '\0';sem_post_V(semid,1);  //释放1号灯资源if(!strncmp(k_addr,"exit",4)){break;}}//取消映射if(-1 == shmdt(k_addr)){perror("shmdt error");exit(-1);}//删除共享内存if(-1 == shmctl(shmid,IPC_RMID,NULL)){perror("shmctl error");exit(-1);}//销毁信号灯集sem_exit(semid);return 0;}
  • 读端:
	#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <unistd.h>#include "sem.h"#include <errno.h>#define PIGE_SIZE 4*1024int main(int argc, char const *argv[]){key_t key = ftok("/home/linux/work", 'K');if(-1 == key){perror("ftok error");exit(-1);}//创建共享内存int shmid = shmget(key,2*PIGE_SIZE,IPC_CREAT|0666);if(-1 == shmid){perror("shmget error");exit(-1);}//映射共享内存char *k_addr = shmat(shmid,NULL,0);if((void *)-1 == k_addr){perror("shmat error");exit(-1);}//创建信号灯集int semid = sem_init(2);while(1){sem_wait_P(semid,1);printf("[%s]\n",k_addr);if(!strcmp(k_addr,"exit")){break;}sem_post_V(semid,0);}//取消映射if(-1 == shmdt(k_addr)){perror("shmdt error");exit(-1);}//删除共享内存if(-1 == shmctl(shmid,IPC_RMID,NULL)){perror("shmctl error");exit(-1);}//销毁信号灯集sem_exit(semid);return 0;}
  • 运行结果:
	linux@ubuntu:~/work/MSG/SME$ ./whellohiI Love Chinalinux@ubuntu:~/work/MSG/SME$ ./r[hello][hi][I Love China]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

adb setting设置

设置主页面 adb shell am start com.android.settings/com.android.settings.Settings 安全 adb shell am start com.android.settings/com.android.settings.SecuritySettings 手机无线信息 adb shell am start com.android.settings/com.android.settings.RadioInfo 更…

买显卡别再只看N、A两家了,这些高性价比I卡也很香

谈起独立显卡&#xff0c;相信不少朋友都会第一时间想起NVIDIA与AMD这两家巨头。然而&#xff0c;除了这两家巨头以外&#xff0c;凭借集显占据全球最高显卡市场份额的英特尔在2021年正式入局了独显市场&#xff0c;并在去年9月的时候公布了Arc A系列显卡阵容&#xff0c;型号从…

算法——动态规划(DP,Dynamic Programming)

一、基础概念 DP的思想&#xff1a; 把问题分成子问题&#xff0c;前面子问题的解决结果被后面的子问题使用DP与分治法的区别&#xff1a; 分治法把问题分成独立的子问题&#xff0c;各个子问题能独立解决 自顶向下DP前面子问题的解决结果被后面的子问题使用&#xff0c;子问题…

【基于APB总线的DES实现】

基于APB总线的DES实现 本文内容摘要APB介绍仿真结果整体仿真写入数据DES加密部分DES加密读出密文 整体代码 本文内容摘要 本文是设计一个可兼容APB总线的DES加密协处理器&#xff0c;用来将DES加密模块与APB总线进行对接&#xff0c;使总线发送来的数据可以正常写入并进行加密后…

Autosar DEM DTC的Debounce策略

文章目录 简介Debounce策略1、基于计数器的 Debounce 策略2、基于时间的Debounce策略 简介 故障事件防抖&#xff0c;与按键防抖&#xff08;软件需要延时确认按键不是误触发&#xff09;的作用类似&#xff0c;目的是为了防止事件误触发采取的策略。 因为DTC并不是一达到触发…

65道Go基础高频题整理(附答案背诵)

说明一下Golang 中 make 和 new 的区别&#xff1f; 好的&#xff0c;关于 make 和 new 在 Go 语言中的区别&#xff0c;我来解释一下。 new 函数的作用&#xff1a; new(T) 函数会为 T 类型的新项分配零值内存&#xff0c;并返回其地址&#xff0c;即一个 *T 类型的值&#x…

产品调研——AI平台

本文主要记录了对腾讯云-TIONE平台、华为云-ModelArt等主流AI平台的产品调研。 交互式建模 简单点说就是提供了带训练资源的云IDE&#xff0c;使用形态包括Notebook、VsCode等。 腾讯云-TI平台 TI平台将tensorflow、pytorch、spark环境等均集成到一个Notebook容器中&#xf…

Android 一分钟使用RecyclerView完美实现瀑布

【免费】安卓RecyclerView瀑布流效果实现资源-CSDN文库 1.WaterfallFlowActivity 主函数代码&#xff1a; package com.example.mytestapplication;import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.widget.Toast;im…

Git总结 | Git面试都问些啥?

什么是Git为什么要用Git等等这些相信看到该标题点进来的同学也不希望浪费时间再看一遍&#xff0c;那么直接进入主题&#xff0c;对于日常工作中常用的Git相关操作进行整理&#xff0c;一起看看吧 面试官&#xff1a;你常用的Git操作是什么? 候选人&#xff1a;git clone 面试…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

【Proteus仿真】【51单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

【vtkWidgetRepresentation】第十四期 二维标注

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtk中的二维标注,主要用于医学领域,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkBiDimension…

新人学习python必须知道的规范(Python-PEP8)

NOTE(注意): 随着时间的推移&#xff0c;更好的编程方式可能会陆续出现&#xff0c;以下基于PEP8整理总结于2023-12-18. 由于加入了自己的一些见解&#xff0c;所以本文并不是PEP8的翻译版本&#xff0c;所以跟PEP8并不100%相同。其中样例代码只摘取了经典的常见的一部分。 以下…

Bash script进阶笔记

数组类型 arr(1 2 3) # 最基础的方式声明数组&#xff0c;用小括号()&#xff0c;元素之间逗号分隔 arr([1]10 [2]20 [3]30) # 初始化时指定index declare -a arr(1 2 3) # 用declare -a声明数组&#xff0c;小括号外面可选使用单引号、双引号 declare -a arr‘(1 2 3)’…

30道C++ 基础高频题整理(附答案背诵版)

1. C和C有什么区别&#xff1f; C是C语言的超集&#xff08;我看网上很多文章说这是不对的&#xff09;&#xff0c;这意味着几乎所有的C程序都可以在C编译器中编译和运行。然而&#xff0c;C引入了许多新的概念和特性&#xff0c;使得两种语言在一些关键点上有显著的区别。 …

漏洞复现-海康威视 NCG 联网网关 login.php 目录遍历漏漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

3.4【窗口】窗口的几何形状(三,窗口旋转)

一,窗口旋转简介 窗口旋转会影响源坐标系。 窗口的旋转由其SCREEN_PROPERTY_ROTATION属性描述。在这种情况下,旋转一词不是指对象围绕轴或中心旋转的真正旋转。屏幕的窗口旋转实际上是一种包括旋转、平移和缩放的变换。当你改变这个属性时,你实际上是在改变相关窗口的源(…

Day64力扣打卡

打卡记录 方格取数&#xff08;线性DP&#xff09; import sys input sys.stdin.readline 输入样例&#xff1a; 8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0 输出样例&#xff1a; 67 n int(input()) w [[0] * (n 1) for _ in range(n 1)] while Tru…

精选硬件连通性测试工具:企业如何做出明智选择

在当今数字化的商业环境中&#xff0c;企业的硬件连通性至关重要。选择适用的硬件连通性测试工具是确保网络和设备协同工作的关键一步。本文将探讨企业在选择硬件连通性测试工具时应考虑的关键因素&#xff0c;以帮助其做出明智的决策。 1. 功能全面性&#xff1a;首要考虑因素…