IO进程(7)

目录

1.信号

1.1信号函数

1.1.1信号处理函数

信号的处理过程

2.共享内存

2.1概念

2.2特点

​​​​​​​​​​​​​​2.3步骤

​​​​​​​2.4函数接口创建

2.4.1key值

​​​​​​​​​​​​​​2.4.2创建或打开共享内存

​​​​​​​​​​​​​​2.4.3映射共享内存

​​​​​​​​​​​​​​2.4.4取消映射

​​​​​​​​​​​​​​2.4.5删除共享内存

​​​​​​​​​​​​​​2.5操作命令


1.信号

1.1信号函数

1.1.1信号处理函数

#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);
功能:信号处理函数
参数:signum:要处理的信号
    handler:信号处理方式
            SIG_IGN:忽略信号
            SIG_DFL:执行默认操作
            handler:捕捉信号  void handler(int sig){} //函数名可以自定义
返回值:成功:设置之前的信号处理方式
      失败:-1

signal函数原型推导过程:

typedef 数据类型 新类型名

typedef void(*sighandler_t)(int)

||

typedef void(*)(int) sighandler_t 函数指针是不支持这样的书写格式的

sighandler_t signal(int signum, void(*)(int) handler);

||

sighandler_t signal(int signum, void(*handler)(int));

||

void(*)(int) signal(int signum, void(*handler)(int));

||

void(*signal(int signum, void(*handler)(int)))(int);

示例:

信号的处理过程

程序运行在用户空间时->进程由于系统调用或中断进入内核->转向用户空间执行信号处理函数->信号处理函数完毕后进入内核->返回用户空间继续执行程序

练习:用信号的知识实现司机和售票员问题。

1)售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印(let's gogogo)

2)售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印(stop the bus)

3)司机捕捉SIGTSTP(代表到达终点站)信号,向售票员发送SIGUSR1信号,售票员打印(please get off the bus)

4)司机等待售票员下车,之后司机再下车。

分析:司机(父进程)、售票员(子进程)

司机:

忽略的信号:SIGINT、SIGQUIT

捕捉的信号:SIGUSR1、SIGUSR2、SIGTSTP

售票员:

忽略的信号:SIGTSTP

捕捉的信号:SIGINT、SIGQUIT、SIGUSR1

2.共享内存

2.1概念

共享内存指的是操作系统在物理内存中申请一块空间,应用程序可以映射到这块空间,进行直接读写操作

​​​​​​​2.2特点

  1. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝
  2. 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间
  3. 进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率
  4. 由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

​​​​​​​​​​​​​​2.3步骤

  1. 创建唯一key值 ftok
  2. 创建或打开共享内存 shmget
  3. 映射共享内存 shmat
  4. 取消映射 shmdt
  5. 删除共享内存 shmctl

​​​​​​​2.4函数接口创建

2.4.1key值

#include <sys/types.h>
#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
功能:创建key值
参数:pathname:文件名
     proj_id:取整型数的低8位数值
返回值:成功:key值
       失败:-1

示例:

补充:

key值是根据pathname的inode号和proj_id的低8位组合而成的。如:0x61011944

pathname只要是路径中存在的文件即可

ls -i 查看文件inode号

​​​​​​​​​​​​​​2.4.2创建或打开共享内存

#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
功能:创建或打开共享内存
参数:
    key  键值
    size   共享内存的大小
                创建       检测错误
    shmflg   IPC_CREAT|IPC_EXCL|0777  创建共享内存的时候的权限
返回值:成功   shmid  共享内存的id
      出错    -1

示例:

查看共享内存命令:ipcs -m

删除共享内存:ipcrm -m shmid

再次执行时会出现报错的情况:

我第一次执行的时候是不是已经创建了这个共享内存,当再一次去执行的时候,肯定会提示文件已存在,共享内存已经存在了

解决方案:

​​​​​​​​​​​​​​2.4.3映射共享内存

void  *shmat(int  shmid,const  void  *shmaddr,int  shmflg);
功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
参数:
    shmid   共享内存的id号
    shmaddr   一般为NULL,表示由系统自动完成映射
              如果不为NULL,那么有用户指定
    shmflg:SHM_RDONLY就是对该共享内存只进行读操作0     可读可写
返回值:成功:完成映射后的地址,
      出错:(void *)-1的地址

示例:

​​​​​​​​​​​​​​2.4.4取消映射

int shmdt(const void *shmaddr);
功能:取消映射
参数:要取消的地址
返回值:成功0  
      失败的-1

示例:

​​​​​​​​​​​​​​2.4.5删除共享内存

int  shmctl(int  shmid,int  cmd,struct  shmid_ds   *buf);
功能:(删除共享内存),对共享内存进行各种操作
参数:
    shmid   共享内存的id号
    cmd     IPC_STAT 获得shmid属性信息,存放在第三参数
            IPC_SET 设置shmid属性信息,要设置的属性放在第三参数
            IPC_RMID:删除共享内存,此时第三个参数为NULL即可    struct  shmid_ds   *buf:是一个结构体指针,但我们是删除共享内存,所以并没有意义,我们直接设置为NULL就可以了
返回:成功0 
     失败-1

用法:shmctl(shmid, IPC_RMID, NULL);

​​​​​​​

​​​​​​​​​​​​​​2.5操作命令

ipcs -m:查看系统中创建的共享内存

ipcrm -m shmid:删除创建的共享内存

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

使用标志位进行同步优化

结构体:(int flag, char buf[32])

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

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

相关文章

pat1074 k个一组反转链表

是我的错觉吗 直接把%d赋值给数组小标&#xff0c;不能把值副进去&#xff1f; 可是这样可以&#xff1f; 乱套了这 同样的代码 所以暂时将你眼睛闭了起来 所以还是好好老实两次赋值 。。。 写糊了已经 注意这句话 链表中部翻转&#xff1a; 不带dummy真的好麻烦且头…

用Python解决预测问题_多元线性回归模板

多元线性回归是一种统计学方法&#xff0c;用于分析两个或多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关系。在最简单的线性回归模型中&#xff0c;只有一个自变量和一个因变量&#xff0c;它们之间的关系可以用一条直线来…

绿色能源的应用与节约,低碳生活方式指南

在这个全球化的时代&#xff0c;环境问题越来越严重&#xff0c;大家都关注的绿色能源和节约成了热门话题。怎样在日常生活中用好绿色能源&#xff0c;实现低碳生活&#xff0c;是每个环保人士都需要了解的关键问题。这篇文章会详细告诉你绿色能源的使用、优点、节约方法以及低…

msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案

诡异的 msxml6.dll错误 80072f7d安全频道支持出错&#xff0c;用 SSLTools.exe 修复的方法无效&#xff01;&#xff01;&#xff01; ’--------------------------------------------------------------- 有如下简要 ASP 代码&#xff0c;用于获取网页链接返回内容&#xf…

window系统开代理在Conda环境中导致pip安装python包出现timeout

文章目录 1: 临时性配置 pip 代理文件2. 永久性配置 pip 代理文件 在使用 Conda 时&#xff0c;如果你设置了代理&#xff0c;但 pip 仍然无法工作&#xff0c;可能需要确保代理配置正确并适用于 pip。以下是几种可能的解决方法&#xff0c;先看一下报错 WARNING: Retrying (Re…

物联网设备字符串转串口指令-SAAS本地化及未来之窗行业应用跨平台架构

一、指令转换作用 现在服务器一般采用json数据格式 但是终端底层都是二进制指令 直接从服务器传输的指令就无法执行&#xff0c;因此需要转换 二、转换源码 void StringToHandleCommand(byte *byteArray, const char *hexString) {bool oddLength strlen(hexString) &…

【威锋网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

实战Kubernetes之快速部署 K8s 集群 v1.28.0

文章目录 一、前言二、主机准备三、系统配置3.1. 关闭防火墙及相关配置3.2. 修改主机名3.3. 主机名DNS解析3.4. 时间同步3.5. 配置网络3.6. 重启服务器 四、安装软件4.1. 安装 Docker4.2. 安装 cri-dockerd4.3. 添加国内YUM源4.4. 安装 kubeadm、kubelet 和 kubectl 五、Master…

jmreport积木报表实战中的设计要点(实时更新)

目录 前言1. 配置数据源2. 数据字典3. excel设计4. 带参数查询 前言 以下为文章记录&#xff0c;主要记录报表工具的使用法则 更加详细的要点推荐阅读&#xff1a; 《数据分析-JiMuReport》积木报表详细入门教程积木报表操作手册 以下为实战中主要的总结要点 1. 配置数据源…

记录一次搭建uniapp-vue3的基础项目

1.使用 HBuilder X 创建uniapp vue3的基础项目 2.安装 自动导包插件 unplugin-auto-import npm install unplugin-auto-import或者 pnpm install unplugin-auto-import2.1 根目录下创建 vite.config.js 复制粘贴以下内容 import { defineConfig } from vite import uni fro…

【握奇数据招聘(北森)-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的&#xff0c;找到了图片识别Excel表格的&#xff0c;有的找图片识别Excel表格的&#xff0c;找到了PDF发票提取表格的&#xff0c;所以就很难搞&#xff0c;还有的说都想要 今天一篇文章&#xff0c;全部搞定所有发票【电子发票&#x…

【计算机组成原理】三、存储系统:1.存储器的分类、层次化结构、性能指标、基本组成(半导体、存储芯片基本原理)

三、存储系统&#xff08;存储器层次结构&#xff09; 文章目录 三、存储系统&#xff08;存储器层次结构&#xff09;1.存储器的分类1.1按在计算机中的作用&#xff08;层次&#xff09;❗多级存储结构&#xff08;层次化结构&#xff09;1.2按存储介质1.3按存取方式1.4按信息…

Godot《躲避小兵》实战之创建游戏主场景

游戏主场景 现在是时候将我们所做的一切整合到一个可玩的游戏场景中了。 创建新场景并添加一个 Node节点&#xff0c;命名为 Main。&#xff08;我们之所以使用 Node 而不是 Node2D&#xff0c;是因为这个节点会作为处理游戏逻辑的容器使用。本身是不需要 2D 功能的。&#x…

STM中的I2C

常见的几种通信接口 I2C总线定义 定义 I2C - Inter-Integrated Circuit&#xff1a;两线式 串行总线&#xff1a;说明处理器和外设之间只需两根信号线&#xff0c;分别是SCL时钟控制信号线和SDA数据线 SCL&#xff08;serial clock line&#xff09; 时钟控制信号线&#xff…

fastadmin 安装

环境要求&#xff0c;大家可以参考官方文档的&#xff0c;我这里使用的是phpstudy&#xff0c;很多已经集成了。 注意一点&#xff0c;PHP 版本&#xff1a;PHP 7.4 。 第二步&#xff1a;下载 下载地址&#xff1a;https://www.fastadmin.net/download.html 进入下载地址后…

【嵌入式裸机开发】智能家居入门7:最新ONENET,MQTT协议接入,最全最新(微信小程序、MQTT协议、ONENET云平台、STM32)

智能家居入门7 前言一、ONENET云平台创建产品与设备二、STM32端连接服务器前的准备三、STM32端实现四、微信小程序端连接服务器前的准备五、微信小程序端实现六、最终测试 前言 本篇文章介绍最新ONENET云平台的MQTT协议接入方法&#xff0c;在STM32上实现数据上云与服务器下发…

TCP和UDP编程的学习

UDP编程特点&#xff1a;c/s模型 不可靠 &#xff1b; 无链接 &#xff1b;数据报形式&#xff08;效率高&#xff09;&#xff1b; TCP编程特点&#xff1a; 面向链接&#xff1b; 可靠传输&#xff1b;&#xff08;保证数据准确可靠&#xff09;&#xff1b; 面向字节流&a…

基于x86 平台opencv的图像采集和seetaface6的口罩人脸检测识别功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的口罩人脸检测识别功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的口罩人脸检测…

【blender】一个汉堡包

第一次建模&#xff0c;哈哈汉堡包样式大差不差。至于这么做的&#xff0c;那么多快捷键完蛋&#xff0c;忘得差不多了&#xff01; 官网地址&#xff1a;https://www.blender.org/download/ 我下载的是4.2版本