首页 > 系统相关 >进程间通信----信号灯集

进程间通信----信号灯集

时间:2024-09-03 11:52:01浏览次数:9  
标签:---- cmd IPC int semid 信号灯 semctl 间通信

目录

一丶概念

二丶操作步骤

三丶命令

四丶函数接口

1.创建信号灯集

2.初始化或删除信号灯集

3.pv操作

练习:


一丶概念

        信号灯(semaphore),也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制;

        System V信号灯集是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。
        通过信号灯集实现共享内存的同步操作

二丶操作步骤

        1.  创建key
        2.  创建或打开信号灯集 semget
        3.  初始化信号灯集 semctl
        4.  pv操作 semop
        5.  删除信号灯集 semctl

三丶命令

        ipcs -s: 查看信号灯集
        ipcrm -s semid: 删除信号灯集
        注意:有时候可能会创建失败,或者semid为0,所以用命令看看,删了重新创建就可以了。

四丶函数接口

1.创建信号灯集

#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
功能:创建/打开信号灯
参数:key:ftok产生的key值
    nsems:信号灯集中包含的信号灯数目
    semflg:信号灯集的访问权限,通常为IPC_CREAT |0666
返回值:成功:信号灯集ID
       失败:-1

2.初始化或删除信号灯集

int semctl ( int semid, int semnum,int cmd,…/*union semun arg*/);
功能:信号灯集合的控制(初始化/删除)
参数:semid:信号灯集ID
    semnum: 要操作的集合中的信号灯编号
     cmd:
        GETVAL:获取信号灯的值,返回值是获得值
        SETVAL:设置信号灯的值,
        IPC_RMID:从系统中删除信号灯集合
    ...:当cmd为SETVAL时,需要传递共用体
返回值:成功 0
      失败 -1
共用体格式:
    union semun {
       int              val;    /* 信号量的初值 */
       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) */
    };
        当cmd为SETVAL时需要传递第四个参数,类型为共用体
        用法:
union semun {
    int val;
};
union semun sem;
sem.val = 10;
semctl(semid, 0, SETVAL, sem); //对编号为0的信号灯设置初值为10
        1.  当cmd为IPC_RMID时,表示删除信号灯集

        用法:semctl(semid, 0, IPC_RMID) // 0:表示信号灯的编号,指定任意一个即可删除
   2.  当cmd为GETVAL时,表示获取信号灯的值
        用法:printf("%d\n", semctl(semid, 0, GETVAL));

3.pv操作

int semop ( int semid, struct sembuf  *opsptr,  size_t  nops);
功能:对信号灯集合中的信号量进行PV操作
参数:semid:信号灯集ID
     opsptr:操作方式
     nops:  要操作的信号灯的个数 1个
返回值:成功 :0
      失败:-1
struct sembuf {
   short  sem_num; // 要操作的信号灯的编号
   short  sem_op;  //    0 :  等待,直到信号灯的值变成0
                   //   1  :  释放资源,V操作
                   //   -1 :  分配资源,P操作                    
    short  sem_flg; // 0(阻塞),IPC_NOWAIT, SEM_UNDO
};

练习:

        通过共享内存实现进程间通信,一个进程从终端输入数据,另一个进程打印数据,循环执行,当输入quit时循环结束

标签:----,cmd,IPC,int,semid,信号灯,semctl,间通信
From: https://blog.csdn.net/qq_64136247/article/details/141813002

相关文章

  • 程序员开发必备MySQL数据可视化视图工具Navicat Premium Lite 精简版安装教程
    程序员开发必备MySQL数据可视化视图工具NavicatPremiumLite精简版使用:https://blog.csdn.net/jky_yihuangxing/article/details/141854667文章目录1.软件官方下载地址2.软件介绍3.下载安装步骤1.软件官方下载地址https://www.navicat.com.cn/products#navi......
  • 正态转换的多种方法
    数据分布呈现非正态时,我们可以将原始数据作某种函数的转换,使偏态资料正态化,从而满足T检验或其他统计分析方法对资料的要求,这一节内容我们将向大家介绍如何对数据资料进行正态转换。一、正偏态分布资料1、轻度正偏态分布偏度值>0,偏度值为其标准误差的2-3倍,即Z-score=2~3,此时......
  • 判断数据正态分布的超多方法!
    一、正态性检验:偏度和峰度1、偏度(Skewness):描述数据分布不对称的方向及其程度(见图1)当偏度≈0时,可认为分布是对称的,服从正态分布;当偏度>0时,分布为右偏,即拖尾在右边,峰尖在左边,也称为正偏态;当偏度<0时,分布为左偏,即拖尾在左边,峰尖在右边,也称为负偏态;注意:数据分布的左偏或......
  • 台球助教系统小程序源码开发与技术解析
        在当今的数字化时代,信息技术与体育运动的融合日益紧密。JAVA台球助教系统源码是一个专门为台球教学设计的多端应用系统,它不仅能够提供个性化的教学体验,还能实现多端数据同步和实时互动。本文将从技术角度出发,深入探讨该系统的特色功能、创新点及其潜在的应用前景。......
  • Linux的目录结构
    1.登录虚拟机用户名:root 密码:0412327右键打开终端二.Linux的基本命令ls 查看当前目录信息pwd   查看当前路径-->查看你在哪里? /root:主目录相当于手机里面home键 mkdir 创建目录,新建文件夹Shell命令格式: 命令+选项+路径(参数)      在......
  • Linux的基本命令
    1.linux的版本 Ubuntu、CentOS、Redhat、Debian、suse-Linux、鸿蒙(HarmonyOS)。鸿蒙系统是一款全新的面向全场景的分布式操作系统,以手机操作为主,链接汽车、智能音箱、可穿戴等设备的分布式操作系统。与Android等系统具有根本性不同,HarmonyOS创新多设备交互,让消费者操控多个......
  • 毕设开发日记第一阶段
    第一阶段完成任务其实很简单,但是因为是第一次使用Unity,美术方面也可以说是零基础,我还是花费了好几天的时间在第一阶段的开发上面。首先我确定是做一个2D的人物移动自由世界的游戏,所以我这边采用Unity作为游戏开发引擎,aseprite作为美术开发工具。人物动画我刚开始尝试自己制作,也......
  • Kestrel
    {"Kestrel":{"Endpoints":{"Http":{"Url":"http://localhost:5000"},"HttpsInlineCertFile":{"Url":"https://localhost:5001",......
  • python爬取音乐小工具
    importrequestscookies={'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f':'1725333776','HMACCOUNT':'15050700AD9FD996','Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f':'1725333791','mode':&......
  • OpenFeign深入学习笔记
    OpenFeign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。OpenFeign是在SpringCloud生态系统中的一个组件,它整合了Ribbon(客户端负载均衡器)和Eureka(服务发现组件),从而简化了微服务之间的调用。在SpringCloud应用中,我们经常会使用OpenFeign,比如......