当前位置: 首页 > news >正文

day28 IPC通信机制

概念

本地通信

传统的通信机制

1.无名管道 pipe

2.有名管道 fifo

3.信号 signal

systemV通信机制 

1.消息队列 message queue

2.共享内存 shared memory

3.信号灯集 semphore

跨主机的通信方式

套接字 socket

无名管道

本质

就是一个内核文件(文件描述符)

操作管道文件本质上就是文件的读取和写入

只可使用文件io函数:open close read write(lseek移动光标不允许使用)

特点

管道文件满足队列的特点

管道数据为一次性

管道读写端关闭后,管道自动释放

write和read读取特殊文件时,默认是阻塞函数

管道大小

65536字节--->64K

管道是一种半双工的通信机制

单工:同时只运行A--->B,不允许B--->A

半双工:同时只允许A--->B 或者 允许B--->A

全双工:同时允许A--->B 也允许B--->A

无名管道

该管道没有名字,只可用于存在亲缘关系的进程间通信

无名管道函数

pipe

#include <unistd.h>

int pipe(int pipefd[2]);

功能:创间无名管道

参数: int pipefd[2]:指向数组长度为2的首地址

            pipefd[0]:管道端 pipefd[1]:管

返回值: 成功返回0,失败返回-1,跟新errno

管道破裂

写端开启,读端关闭,不可以写,写入会发生管道破裂

无名管道

和无名管道大部分无异

区别---可用于无亲缘

该管道有名字,可以用于不存在亲缘关系的进程间通信

有名管道函数

mkfifo

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);

功能:创建有名管道

参数:const char *pathname        创建有名管道的路径以及文件名

           mode_t mode                     权限(记得修改权限掩码umask(0);)

返回值:成功0,失败-1,更新errno

信号   

概念      

信号:是一种软件层上的中断模拟,是一种异步通信模式

异步:任务与任务之间没关系,按照时间片轮询机制访问

同步:任务有层级关系,先执行前置任务,才能执行后续任务

信号的处理方式

默认:当触发信号后,默认执行信号对应的处理函数

忽略:当触发信号后,会忽略信号处理函数

捕获:当触发信号后,做另一个信号处理函数

认识信号

kill -l        查看信号

1-31        标准信号,当多次发送时,内核只做一次处理

34-64      实时信号,当多次发送时,会把信号存于队列,执行上一个信号后,再执行下一个(类比vip)

硬件点出来的信号

2)SIGINT        ctrl c

3)SIGQUIT     ctrl \

19)  SIGSTOP  ctrl z

不可忽略和捕获的信号

9)SIGKILL

19)SIGSTOP 

常见信号

11) SIGSEGV 段错误时

13) SIGPIPE 管道破裂

14) SIGALRM 时钟

17) SIGCHLD 子进程退出后给父进程发送该信号

信号相关函数

signal

sighandler_t signal(int signum, sighandler_t handler);

功能:信号处理函数(默认,忽略,捕获)

参数:int signum        处理的信号编号

           sighandler_t handler        处理方式    函数指针

           SIG_IGN        忽略

           SIG_DFL        默认

           函数名            捕获

返回值:成功返回之前的信号处理方式,失败返回SIG_ERR,更新errno

信号屏蔽

正在执行信号处理函数时,重新同一个信号,后面的信号会被屏蔽不执行,此时需要其他信号终止

kill

int kill(pid_t pid, int sig);

功能:发送信号

参数:pid_t pid     

pid进程
>0

给指定的进程发送

=0给当前进程组下所有进程发送
=-1给主机下的所有有权限的进程发送,不含1
<-1

把信号发给|pid| 进程组 下的所有进程组

        int sig        信号

返回值:成功返回0,失败返回-1,更新errno

alarm

unsigned int alarm(unsigned int seconds);

功能:发送一个时钟信号 等价于 kill(pid,14)

参数:unsigned int seconds 定的时间(秒数)

返回值:返回生一次未被触发的剩余秒数,没有则返回0

速记

函数功能用法参数返回值
pipe无名管道创建int pipefd[2];  pipe(pipefd);pipefd数组成0败-1,更新errno
mkfifo有名管道创建mkfido(路径,权限)路径,权限成0败-1,更新errno
signal信号处理signal(信号编号,信号方式)

handler

SIG_IGN 忽略

SIG_DFL 默认

函数名     捕获

成功返回之前的信号处理方式,失败返回SIG_ERR,更新errno
kill发送信号kill(pid,信号)

pid_t pid

0    当前组下

>0  即pid

成功返回0,失败返回-1,更新errno
alarm定时alarm(秒数)秒数返回生一次未被触发的剩余秒数,没有则返回0

http://www.dtcms.com/a/323094.html

相关文章:

  • C++隐式转换的魔法与陷阱:explicit关键字的救赎
  • RecyclerView 缓存机制
  • centos 怎么将一些命令设置为快捷命令
  • 2025华数杯数学建模C题:可调控生物节律LED光源全解析
  • LLM表征的提取方式
  • 【Python 高频 API 速学 ⑥】
  • 【Mac】MLX:Lora微调工作流
  • 【排序算法】①直接插入排序
  • QT第二讲-信号和槽
  • uniapp实现的圆形滚盘组件模板
  • ThingsBoard配置邮件发送保姆级教程(新版qq邮箱)
  • SkyWalking-2--Java Agent是什么?
  • Qt与嵌入式设备中的字节序问题
  • 客服Agent革命:智能客服系统的技术实现与效果评估
  • 八、《DaaS(设备即服务):企业轻资产化新路径》--从97.4%首期投入削减到AI算力高效迭代的范式革命
  • ​​​​​​​【Datawhale AI夏令营】多模态RAG财报问答挑战赛:学习笔记与上分思考
  • “黑影御剑飞行”视频引发的思考
  • 差分放大电路的四种接法
  • react-window
  • 组合期权:垂直价差
  • Playwright C# 自动登录并上传 Excel 文件 的可运行示例
  • Java 数据类型与内存模型:从字节到引用的底层逻辑
  • 数字图像处理基础——opencv库(Python)
  • C语言库中的字符函数
  • 基于 RAUC 的 Jetson OTA 升级全攻略
  • Vue和Springboot初步前后端分离建立项目连接(解决前后端跨域问题)
  • linux安装php
  • 机器学习 K-Means聚类 无监督学习
  • AI 算法优化实战指南:从理论到部署的全流程优化策略
  • VSCode添加Python、Java注释技巧、模板