Linux进程间通信
每个进程的用户空间都是独立的,不能相互访问。
所有进程的内核空间(32位系统3G-4G)都是共享的
应用场景
- 作为缓冲区,处理速度不同的进程之间的数据传输
- 资源共享:多个进程之间共享同样的资源,一个进程对共享数据的修改,别的进程应该立刻看到
- 数据传输: 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
一、管道
缺点:缓存区在内核中大小受限,只能承载无格式字节流;单向通信方式,低效,不适合频繁交换数据
生命周期随着进程创建而建立,随着进程终止而消失
遵循先进先出原则,不支持 lseek 之类的文件定位操作
需要双方通信时,需要建立起两个管道
读端不读或者读的慢,写端要等待读端;
读端关闭,写端收到SIGPIPE信号直接终止;
写端不写或者写的慢,读端要等待写端;
写端关闭,读端读完pipe内部的数据然后再读,会读到0为止,表明读到文件结尾;
匿名管道 pipe
特殊文件只存在于内存,没有存在于文件系统中
只能用于有亲缘关系的进程间
shell 命令中的竖线就是匿名管道
pipe() 和 fork() 搭配

有名管道 fifo
mkfifo myfifo #在文件系统中创建一个类型为 p 的设备文件
int mkfifo(const char *pathname, mode_t mode); //默认在当前的路径下创建
mkfifo("myfifo", 0666);
open("myfifo", O_RDONLY);
open(MY_FIFO, O_WRONLY);
二、System V 进程间通信(操作系统层面上进程间通信方案)
消息队列和共享内存是以传输数据为目的
信号量是为了保证进程间的同步与互斥而设计的
-
消息队列
是消息的链表,存放在内核中并由消息队列标识符标识,
缺点:通信不及时;有大小限制,在内核中一条消息最大长度MSGMAX 和一个队列的最大长度MSGMNB(以字节为单位),
不适合比较大数据的传输;用户态与内核态之间的数据拷贝开销 -
共享内存–最快的IPC
映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,多个进程均能访问
带来新的问题:多进程间竞争共享资源,常与信号量配合使用
生命周期是随内核的,进程要主动删除其创建的共享内存:ipcrm -m {shmid}
共享内存块的大小都必须是系统页面大小的整数倍。系统页面大小指的是系统中单个内存页面包含的字节数。在 Linux 系统中,内存页面大小是4KB,不过您仍然应该通过调用 getpagesize 获取这个值(通过man 2 getpagesize查看 )
#include <sys/ipc.h>
#include <sys/shm.h> // shmget
#include <sys/types.h> // key_t
// key_t ftok(const char *pathname, int proj_id); //获取key值
// int shmget(key_t key, size_t size, int shmflg); //得到共享内存标识符,不存在时创建并返回
// void* shmat(int shmid, const void *shmaddr, int shmflg); //共享内存绑定到当前进程的地址空间中
// int shmdt(const void *shmaddr); //取消共享内存与进程地址空间之间的关联
// int shmctl(int shmid, int cmd, struct shmid_ds *buf); //cmd表示具体控制动作:IPC_STAT,IPC_SET改变状态,IPC_RMID 删除key_t key = ftok(PATH_NAME, PROJ_ID);//获取key值
shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL); //操作系统给用户返回的id// ipcs命令查看有关进程间通信设施的信息
// -q:列出消息队列相关信息。
// -m:列出共享内存相关信息。
// -s:列出信号量相关信息


信号量一个整型的计数器表示资源的数量。两原子操作
P 操作: 把信号量 -1。相减后信号量 >= 0,表明还有资源可使用,进程可正常继续执行,否则进程需阻塞等待
V 操作: 把信号量 +1。相减后信号量 > 0,表明当前没有阻塞中的进程;否则表明当前有阻塞中的进程,将该进程唤醒运行

信号:用于通知接收进程某个事件已经发生,唯一的异步通信机制。缺点:传递信息少
信号事件来源主要: 硬件来源(如键盘 Cltr+C )和 软件来源(如 kill 命令)
可以在任何时候发送信号给某一进程,一旦有信号产生,进程就对信号处理(执行默认操作,定义一个信号处理函数,忽略信号)
# Ctrl+C 产生 SIGINT 信号,表示终止该进程;
# SIGTERM 终止该进程;通过 Core Dump 将当前进程的运行状态保存在文件里面,方便事后分析问题在哪里
# Ctrl+Z 产生 SIGTSTP 信号,表示停止该进程,但还未结束;
kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
套接字:3个属性:域、类型、协议。唯一的跨网络主机的通信机制
// domain: AF_INET 用于 IPV4、
// AF_INET6 用于 IPV6
// AF_LOCAL/AF_UNIX 二者等价,用于本机
// type: SOCK_STREAM 字节流,对应 TCP
// SOCK_DGRAM 数据报,对应 UDP
// SOCK_RAW 原始套接字
int socket(int domain, int type, int protocal);
TCP 服务端负责监听的 socket 叫作监听 socket ==> listen_fd
调用 accept 时,连接成功,会返回一个已完成连接的 socket,叫作已完成连接 socket ==> sock_fd,用来后续传输数据。
是「两个」 不同 socket

UDP 是没有连接的,所以不需要三次握手。不存在客户端和服务端的概念
每次通信时,调用 sendto 和 recvfrom,都要传入目标主机的 IP 地址和端口

本地 socket 的实现效率大大高于 IPv4 和 IPv6 的字节流、数据报 socket 实现
不像 TCP 和 UDP 要绑定 IP 地址和端口,而是绑定一个本地文件
三、POSIX 进程间通信:共享内存、消息队列、信号量、
参考:https://www.cnblogs.com/tongh/p/18002994
Linux内核v2.6.6和glibc2.3.4之后的版本支持POSIX消息队列 (ldd --version)
POSIX:可移植操作系统接口,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945
标准线上地址:注册后可以在线阅读或者下载。
IEEE和Open Group 的POSIX认证
相关页面
20世纪80年代中期,Unix厂商试图通过加入新的、往往不兼容的特性来使它们的程序与众不同。局面非常混乱,麻烦也就随之而来了。为了提高兼容性和应用程序的可移植性,阻止这种趋势, IEEE(电气和电子工程师协会)开始努力标准化Unix的开发,后来由 Richard Stallman命名为“Posix”。
这套标准涵盖了很多方面,比如Unix系统调用的C语言接口、shell程序和工具、线程及网络编程
有了这个规范,就可以调用通用的API
消息队列-
优点
灵活,支持多种数据类型和优先级。
可靠,消息持久化且不会因发送者崩溃而丢失。
高效,支持大量数据的传输和并行处理 -
缺点
数据复制的开销。
需要管理访问权限以确保安全性。
-
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>mqd_t mq_open(const char *name, int oflag, ...); //打开一个已存在的消息队列,或创建一个新的消息队列
//发送消息
int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio);
int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);//接收消息
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio);
ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout);//设置/获取消息队列的属性
int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);
int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat);int mq_close(mqd_t mqdes); //关闭
int mq_unlink(const char *name); //删除一个命名的消息队列。
共享内存
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */int shm_open(const char *name, int oflag, mode_t mode); //创建或打开一个POSIX共享内存对象
int ftruncate(int fd, off_t length); //设置大小
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //映射到进程的地址空间
int munmap(void *addr, size_t length); //解除映射
int shm_unlink(const char *name); //删除共享内存对象
信号量
有名信号量:操作系统内核维护的具有全局唯一名字的信号量
无名信号量是一种不具有全局唯一名字的信号量,通常只能在相关的进程或线程之间进行共享
只有0和1两种取值的信号量叫做二进制信号量
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //创建或打开有名信号量
int sem_init(sem_t *sem, int pshared, unsigned int value); //初始化无名信号量int sem_getvalue(sem_t *sem, int *sval); //获取当前信号量的值
int sem_post(sem_t *sem); //V操作:信号量 +1
int sem_wait(sem_t *sem); //等待信号量减小。如果信号量的值大于0,则将其减小1并立即返回,否则会阻塞当前线程直到信号量变为大于0为止
int sem_trywait(sem_t *sem); //尝试等待信号量减小的非阻塞版本。如果信号量的值大于0,则将其减小1并立即返回,否则会立即返回,并且不会阻塞当前线程
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); //函数允许设置一个超时时间,如果在指定的时间内未能获得信号量,函数将返回一个特定的错误码int sem_close(sem_t *sem); //关闭有名信号量
int sem_destroy(sem_t *sem); //销毁无名信号量
int sem_unlink(const char *name); //从系统中删除有名信号量
操作系统发展历史

相关文章:
Linux进程间通信
每个进程的用户空间都是独立的,不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区,处理速度不同的进程之间的数据传输资源共享:多个进程之间共享同样的资源,一个进程对共享数据的修改,…...
【二叉树算法题记录】222. 完全二叉树的节点个数
题目描述 给你一棵 完全二叉树 的根节点root ,求出该树的节点个数。 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位…...
每日新闻掌握【2024年5月6日 星期一】
2024年5月06日 星期一 农历三月廿八 大公司/大事件 多个品牌黄金优惠后价格重回600元/克以下 “五一”假期期间,记者走访调研黄金消费市场发现,受国际金价回落及“五一”假期促销等多重因素影响,终端黄金价格出现了较为明显的回落。包括周大…...
谈谈Tcpserver开启多线程并发处理遇到的问题!
最近在学习最基础的socket网络编程,在Tcpserver开启多线程并发处理时遇到了一些问题! 说明 在linux以及Windows的共享文件夹进行编写的,所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题!!&…...
618好物节不知道买什么?快收下这份好物推荐指南!
随着618好物节的临近,你是否在为选择什么产品而犹豫不决?不用担忧,我精心准备了一份购物指南,旨在帮助你发现那些性价比高、口碑爆棚的商品。无论是科技新品还是生活小物件,这份指南都能帮你快速定位到那些值得投资的好…...
Django高级表单处理与验证实战
title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: Django表单验证逻辑模板渲染安全措施表单测试重定向管理最佳实践 引言: 在Web应用开发中,表单是用户与应用之间进行交互的重要…...
类和对象-Python-第一部分
初识对象 使用对象组织数据 class Student:nameNonegenderNonenationalityNonenative_placeNoneageNonestu_1Student()stu_1.name"林军杰" stu_1.gender"男" stu_1.nationality"中国" stu_1.native_place"山东" stu_1.age31print(stu…...
Pytorch实现图片异常检测
图片异常检测 异常检测指的是在正常的图片中找到异常的数据,由于无法通过规则进行识别判断,这样的应用场景通常都是需要人工进行识别,比如残次品的识别,图片异常识别模型的目标是可以代替或者辅助人工进行识别异常图片。 AnoGAN…...
【NOI-题解】1586. 扫地机器人1430 - 迷宫出口1434. 数池塘(四方向)1435. 数池塘(八方向)
文章目录 一、前言二、问题问题:1586 - 扫地机器人问题:1430 - 迷宫出口问题:1434. 数池塘(四方向)问题:1435. 数池塘(八方向) 三、感谢 一、前言 本章节主要对深搜基础题目进行讲解…...
探究MySQL行格式:解析DYNAMIC与COMPACT的异同
在MySQL中,行格式对于数据存储和检索起着至关重要的作用。MySQL提供了多种行格式,其中DYNAMIC和COMPACT是两种常见的行格式。 本文将深入探讨MySQL行格式DYNAMIC和COMPACT的区别,帮助读者更好地理解它们的特点和适用场景。 1. MySQL行格式简…...
MATLAB绘制蒸汽压力和温度曲线
蒸汽压力与温度之间的具体关系公式一般采用安托因方程(Antoine Equation),用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下: [\log_{10} P A - \frac{B}{C T}] 其中, (P) 是蒸汽压(…...
repo跟git的关系
关于repo 大都讲的太复杂了,大多是从定义角度跟命令角度去讲解,其实从现实项目使用角度而言repo很好理解. 我们都知道git是用来管理项目的,多人开发过程中git功能很好用.现在我们知道一个项目会用一个git仓库去管理,项目的开发过程中会使用git创建分支之类的来更好的维护项目代…...
Mysql 8.0 -- 最新版本安装(保姆级教程)
Mysql 8.0 -- 最新版本安装(保姆级教程) 一,下载Mysql数据库: 官网链接:https://www.mysql.com/downloads/ 二,安装Mysql: 三,找到Mysql安装目录: 找到mysql安装目录…...
sql优化思路
sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称,可以尽量使用覆盖索引,避免回表查询,因此可以提高效率 2.字面意思,无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…...
gin学习1-7
package mainimport ("github.com/gin-gonic/gin""net/http" )// 响应json还有其他响应差不多可以去学 func _string(c *gin.Context) {c.String(http.StatusOK, "lalal") } func _json(c *gin.Context) {//json响应结构体type UsetInfo struct …...
likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?
本人是商业用户所以能持续得到最新商业版,今天我说下likeshop里面怎么打包小程序,大家得到程序时候会发现它有admin目录 app目录 server目录 这三个目录分别是做什么呢? 1.admin目录 下面都是架构文件使用得是Node.js打包得,至于…...
(done) LSTM 详解 (包括它为什么能缓解梯度消失)
RNN 参考视频:https://www.bilibili.com/video/BV1e5411K7oW/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 LSTM 参考视频:https://www.bilibili.com/video/BV1qM4y1M7Nv?p5&vd_source7a1a0bc74158c6993c7355c5…...
springboot使用研究
map-underscore-to-camel-case: true 开启驼峰命名 GetMapping("/userInfo")public Result<Users> userInfo(RequestHeader(name "Authorization") String token,HttpServletResponse response) {Map<String, Object> map JwtUtil.parseT…...
老旧房屋用电线路故障引起的电气火灾预防对策
摘 要:在我国新农村建设方针指引下,农村地区的发展水平有了显著提高。在农村经济发展中,我们也要认识到其中存在的风险隐患问题,其中重要的就是火灾事故。火灾事故给农村发展带来的不利影响,不仅严重威胁到农村群众的生…...
OpenAI发布GPT-4.0使用指南
大家好,ChatGPT 自诞生以来,凭借划时代的创新,被无数人一举送上生成式 AI 的神坛。在使用时,总是期望它能准确理解我们的意图,却时常发现其回答或创作并非百分之百贴合期待。这种落差可能源于我们对于模型性能的过高期…...
别再只用按键了!用STM32F103的ADC读取电位器,给你的无感无刷电机做个“油门”
从油门踏板到电机转速:STM32F103 ADC精准控制无刷电机的交互设计艺术 清晨的咖啡机发出均匀的研磨声,电动滑板车在街道上流畅加速,这些看似简单的机械运动背后,都隐藏着一个精妙的交互设计——如何让人类的手部动作与电机转速建立…...
别再死记硬背Transformer了!用大白话和代码图解,5分钟搞懂Self-Attention核心
用图书馆借书的故事讲透Transformer自注意力机制 想象你走进一个巨大的图书馆,书架上摆满了各种书籍。你需要找到一本关于"深度学习"的书,但你不确定具体是哪一本。这时候,图书管理员会怎么做?她会根据你的需求…...
指纹采集器模块选型指南|如何选择合适的指纹采集模块
在做指纹门禁、指纹考勤、指纹保险箱或嵌入式终端时, 指纹采集器模块几乎是整个系统的核心。 模块选对了,项目推进顺畅;选错了,后期调试、售后问题不断。 本文不讲复杂参数,只从实际应用出发, 用最通俗的方…...
为什么顶级策展人不用Google搜文化新闻?Perplexity文化垂直搜索的5层语义增强架构(含可复用prompt工程模板)
更多请点击: https://kaifayun.com 第一章:为什么顶级策展人不用Google搜文化新闻? 顶级策展人并非排斥搜索引擎,而是早已构建起一套高度结构化、语义化、可验证的信息摄取系统——它绕过关键词匹配的偶然性,直击文化…...
基于ES32F0101的无传感器方波控制BLDC驱动方案设计与实践
1. 项目概述:从家庭草坪维护痛点出发家里有块小草坪的朋友,估计都经历过手动修剪的“痛苦”。蹲着、弯着,用剪刀或者手动推草机,折腾半天不仅腰酸背痛,剪出来的草坪还跟狗啃似的,高高低低,毫无美…...
Spring Cloud Sleuth 响应式编程支持:WebFlux 与 Reactor 追踪实践
Spring Cloud Sleuth 响应式编程支持:WebFlux 与 Reactor 追踪实践 【免费下载链接】spring-cloud-sleuth Distributed tracing for spring cloud 项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-sleuth Spring Cloud Sleuth 是 Spring Cloud 生…...
从零开始:YY3568开发板刷写原生Linux系统全流程指南
1. 项目概述与核心价值 最近拿到了一块YY3568开发板,这是一款基于瑞芯微RK3568芯片的嵌入式开发平台,性能相当不错。很多朋友拿到开发板后,第一反应就是跟着官方文档跑个Demo,或者直接用板子预装的Android系统。但如果你和我一样&…...
3分钟快速上手Inter字体:免费开源字体如何提升你的数字产品体验
3分钟快速上手Inter字体:免费开源字体如何提升你的数字产品体验 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter Inter字体是一款专为屏幕显示设计的开源无衬线字体,凭借其出色的可读性和多语言…...
基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码)
基于 SOFAJRaft + Spring Boot 构建高可用 KV 存储集群(完整源码) 引言 在分布式系统中,一致性 是核心难题。Raft 是比 Paxos 更易于理解的共识算法,而 SOFAJRaft 是蚂蚁集团开源的 Java 高性能 Raft 实现。 本文带你从零构建一个 3 节点高可用 KV 存储集群,包含完整源码、…...
【AI概念设计黄金标准】:NASA前可视化总监揭秘——如何用Midjourney输出符合影视工业管线的分镜资产
更多请点击: https://intelliparadigm.com 第一章:AI概念设计黄金标准的工业级定义 在高可靠性AI系统开发中,“概念设计”并非抽象构思阶段,而是承载可验证性、可追溯性与可部署性的工程锚点。工业级定义要求该阶段输出必须满足…...
