IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux环境编程Day08 -> 正文阅读

[系统运维]Linux环境编程Day08

进程间通信

基本概念:

????什么是进程间通信:

????????是指两个或多个进程之间交互数据的过程,是因为进程之间是相互独立的,为了协同工作的需要必须要交互数据

????进程间通信的分类:

????????简单的进程间通信:信号、文件、环境变量、命令行参数

????????传统的进程间通信:管道文件

????????XSI进程间通信:???共享内存、消息队列、信号量

????????网络进程间通信:??套接字Socket

传统进程间通信-管道(FIFO):

????管道是UNIX系统中最古老的进程间通信方式,古老意味着所有系统都支持,早期的管道文件都是半双工,现有的一些系统的管道是全双工的

????管道是一种特殊的文件,它的数据在文件中是流动的,读取之后就会消失,如果文件中没有任何数据读取时会阻塞

????

????有名管道:基于有文件名的管道文件的通信

????????编程模型:

????????????进程A???????????????????进程B

????????????创建管道

????????????打开管道????????????????打开管道

????????????写数据??????????????????读数据

????????????关闭管道????????????????关闭管道

????????????删除管道????????

????????创建管道文件:

????????????1、mkfifo?filename

????????????2、函数

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

????????????功能:创建有名管道文件

????????????pathname:管道文件路径

????????????mode:管道文件权限????

????

????匿名管道:

????????注意:匿名管道只适合通过fork创建的父子进程之间使用

????????int?pipe(int?pipefd[2]);

????????功能:创建一个匿名管道文件,返回管道文件的读权限fd和写权限fd

????????pipefd:返回用于存储管道文件读写fd的数组,输出型参数

????????????????pipefd[0]?用于读???

????????????????pipefd[1]?用于写

????????

????????编程模型:

????????????父进程??????????????????子进程

????????获取一对fd??????????????????共享了一对fd

????????关闭读??????????????????????关闭写

????????写数据??????????????????????读数据

????????关闭写??????????????????????关闭读

XSI进程间通信:

????X/Open公司制定用于进程间通信的系统接口

????XSI进程间通信技术都需要借助系统内核,需要创建内核对象,内核对象会以整数形式返回给用户态,相当于文件描述符,也叫做IPC标识符

????文件的创建打开需要借助文件名,同样的,IPC内核对象创建需要借助IPC键值(整数),必须要确保IPC键值是独一无二的

????key_t?ftok(const?char?*pathname,?int?proj_id);

????功能:计算出一个独一无二的IPC键值

????pathname:项目路径,不是依靠字符串计算,而是依靠路径的位置以及项目编号计算的,所以不能提供假路径,否则可能会产生同样的IPC键值

????proj_id:项目编号

????返回值:计算出来的IPC键值

共享内存:

????基本特点:

????????两个或者多个进程之间共享一块由内核负责维护的内存,该内存可以与多个进程的虚拟内存进行映射

????????优点:不需要复制信息,是一种最快的IPC通信机制

????????缺点:需要考虑同步访问的问题,一般借助信号来解决

????????int?shmget(key_t?key,?size_t?size,?int?shmflg);

????????功能:创建/获取共享内存

????????key:由进程提供的一个独一无二的IPC键值

????????size:共享内存的大小,获取时该参数无意义,一般给0

????????shmflg:

????????????IPC_CREAT???创建共享内存

????????????IPC_EXCL????共享内存如果已存在,则返回错误

????????????获取时直接给0

????????????mode_flags??创建共享内存时需要提供权限?IPC_CREAT|0644

????????返回值:IPC标识符,错误时返回-1

????????void?*shmat(int?shmid,?const?void?*shmaddr,?int?shmflg);

????????功能:让虚拟内存与共享内存进行映射

????????shmid:IPC标识符

????????shmaddr:想要映射的虚拟内存首地址,为NULL时系统会自动操作

????????shmflg:

????????????SHM_RDONLY:以只读方式映射共享内存

????????????SHM_RND:只有当shmaddr参数不为NULL时有效,表示对shmaddr参数向下取内存页的整数倍,作为映射地址

????????????如果都不需要,则写0

????????返回值:与共享内存映射后的虚拟内存的首地址,失败返回(void?*)?-1?或者????????0xFFFFFFFF

????????int?shmdt(const?void?*shmaddr);

????????功能:取消映射

????????shmaddr:映射过的虚拟内存首地址

????????int?shmctl(int?shmid,?int?cmd,?struct?shmid_ds?*buf);

????????功能:删除/控制共享内存

????????shmid:IPC标识符

????????cmd:

????????????IPC_STAT????获取共享内存的属性?则buf为输出型参数

????????????IPC_SET?????设置共享内存的属性?则buf为输入型参数

????????????IPC_RMID????删除共享内存???????则buf给NULL

????????buf:

?????????struct?shmid_ds?{

???????????????struct?ipc_perm?shm_perm;????//所有者的相关信息

???????????????size_t??????????shm_segsz;???//共享内存的字节数

???????????????time_t??????????shm_atime;???//最后映射的时间

???????????????time_t??????????shm_dtime;???//最后取消映射的时间

???????????????time_t??????????shm_ctime;???//最后改变的时间

???????????????pid_t???????????shm_cpid;????//创建者的进程号

???????????????pid_t???????????shm_lpid;????//最后映射、取消映射者的进程号

???????????????shmatt_t????????shm_nattch;??//当前映射的次数

???????????????...

???????????};

????????struct?ipc_perm?{

???????????????key_t??????????__key;????//创建共享内存的IPC键值

???????????????uid_t??????????uid;??????//当前使用共享内存的用户ID

???????????????gid_t??????????gid;??????//当前使用共享内存的组ID

???????????????uid_t??????????cuid;?????//创建共享内存的用户ID

???????????????gid_t??????????cgid;?????//创建共享内存的用户组ID

???????????????unsigned?short?mode;?????//共享内存的权限

???????????????unsigned?short?__seq;????//共享内存的序列号

???????????};

????

????编程模型:

????????????进程A???????????????????进程B

????????创建共享内存????????????获取共享内存

????????映射共享内存????????????映射共享内存

????????写数据并通知其他进程?????接收到通知后读数据

????????接收到通知后读数据??????写数据并通知其他进程

????????取消映射????????????????取消映射

????????删除共享内存????????????

消息队列:

????基本特点:

????????由内核维护管理的数据链表,是通过消息类型收发数据?

????int?msgget(key_t?key,?int?msgflg);

????功能:创建\获取消息队列

????key:IPC键值

????msgflg:

????????IPC_CREAT???创建消息队列

????????IPC_EXCL????如果消息队列已存在则返回错误

????????mode:???????当创建消息队列时需要提供权限

????返回值:成功返回IPC标识符,失败返回-1

????int?msgsnd(int?msqid,?const?void?*msgp,?size_t?msgsz,?int?msgflg);

????功能:向消息队列发送数据

????msqid:IPC标识符

????msgp:要发送的消息的首地址

????????struct?msgbuf?{

???????????????long?mtype;???????//?消息类型

???????????????char?mtext[n];????//?数据

???????????};

????msgsz:数据的字节数,是不包含消息类型的

????msgflg:

????????阻塞一般写0

????????IPC_NOWAIT??当消息队列满时,不等待立即返回

????ssize_t?msgrcv(int?msqid,?void?*msgp,?size_t?msgsz,?long?msgtyp,int?msgflg);

????功能:从消息队列中读取数据

????msqid:IPC标识符

????msgp:存储数据结构体首地址

????msgsz:数据结构体的字节数

????msgtyp:要读取的消息类型,是按照类型的值来读取消息,而不是按照顺序

????????>0?读取消息队列中第一条等于msgtyp的消息

????????=0?读取消息队列中的第一条消息

????????<0?读取消息类型小于abs(msgtyp)的消息,如果有多个满足则读取值最小的

????msgflg:????

????????IPC_NOWAIT?消息类型不符合时不阻塞,立即返回

????????MSG_EXCEPT?如果msgtyp>0,则读取第一个消息类型不是msgtyp的消息

????????MSG_NOERROR?如果不包含此标记,则消息的实际长度>msgsz,则会返回错误,并且读取失败,如果包含此标记,则最多读取msgsz个字节,确保一定成功

????返回值:成功读取到的字节数

???????

????int?msgctl(int?msqid,?int?cmd,?struct?msqid_ds?*buf);

????功能:删除/控制消息队列

????msqid:IPC标识符

????cmd:

????????IPC_STAT????获取消息队列的属性?则buf为输出型参数

????????IPC_SET?????设置消息队列的属性?则buf为输入型参数

????????IPC_RMID????删除消息队列???????则buf给NULL

????buf:

????struct?msqid_ds?{

????????struct?ipc_perm?msg_perm;?????//?属主信息

????????time_t??????????msg_stime;????//?最后发送时间

????????time_t??????????msg_rtime;????//?最后接收时间

????????time_t??????????msg_ctime;????//?最后修改时间

????????unsigned?long???__msg_cbytes;?//?当前消息队列字节数

????????msgqnum_t???????msg_qnum;?????//?当前的消息数量

????????msglen_t????????msg_qbytes;???//?消息的最大字节数

????????pid_t???????????msg_lspid;????//?最后发送者的PID

????????pid_t???????????msg_lrpid;????//?最后接收者的PID

????};

????编程模型:

????????进程A???????????????????????进程B

????创建消息队列????????????????????获取消息队列

????发送消息????????????????????????接收消息

????接收消息????????????????????????发送消息

????删除消息队列




?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:13:10  更:2021-09-11 19:14:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:42:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码