Linux操作系统——第四章 进程间通信

这篇具有很好参考价值的文章主要介绍了Linux操作系统——第四章 进程间通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

Linux操作系统——第四章 进程间通信

 

目录

进程间通信介绍

进程间通信目的

进程间通信发展

进程间通信分类

管道

System V IPC

POSIX IPC

管道

什么是管道

匿名管道

管道读写规则

管道特点

命名管道

创建一个命名管道

匿名管道与命名管道的区别

命名管道的打开规则

system V共享内存

共享内存示意图 

共享内存数据结构

共享内存函数

shmget函数 

shmat函数

 shmdt函数

shmctl函数

进程互斥


 



进程间通信介绍



进程间通信目的



数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。


进程间通信发展



管道

System V进程间通信
POSIX进程间通信


进程间通信分类



管道



匿名管道pipe
命名管道



System V IPC


System V 消息队列
System V 共享内存
System V 信号量


POSIX IPC


消息队列
共享内存
信号量
互斥量
条件变量
读写锁



管道



什么是管道



管道是Unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道

 Linux操作系统——第四章 进程间通信


匿名管道


#include <unistd.h>
功能:创建一无名管道
原型 int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码 

Linux操作系统——第四章 进程间通信

 


管道读写规则



当没有数据可读时

  • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
  • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。


当管道满的时候

  • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
  • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN

如果所有管道端对应的文件描述符被关闭,则read返回0
如果所有管道端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。 

 


管道特点


  • 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
  • 管道提供流式服务

                一般而言,进程退出,管道释放,所以管道的生命周期随进程
                一般而言,内核会对管道操作进行同步与互斥

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

Linux操作系统——第四章 进程间通信 

 

 


命名管道


  • 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。
  • 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
  • 命名管道是一种特殊类型的文件

创建一个命名管道



命名管道可以从命令行上创建,命令行方法是使用下面这个命令:

mkfifo filename 

命名管道也可以从程序里创建,相关函数有

int mkfifo(const char *filename文件名 ,   mode_t mode文件权限);


匿名管道与命名管道的区别


  • 匿名管道由pipe函数创建并打开。
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一旦这些工作完成之后,它们具有相同的语义。

命名管道的打开规则


  • 如果当前打开操作是为读而打开FIFO时

                O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO
                O_NONBLOCK enable:立刻返回成功

  • 如果当前打开操作是为写而打开FIFO时

                O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO
                O_NONBLOCK enable:立刻返回失败,错误码为ENXIO



system V共享内存




共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据


共享内存示意图 


 

Linux操作系统——第四章 进程间通信


共享内存数据结构


 struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */
}


共享内存函数



shmget函数 


功能:用来创建共享内存
原型
int shmget(key_t key, size_t size, int shmflg);
参数
key:这个共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1


shmat函数


功能:将共享内存段连接到进程地址空间
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid: 共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -
(shmaddr % SHMLBA)
shmflg=SHM_RDONLY,表示连接操作用来只读共享内存


 shmdt函数


功能:将共享内存段与当前进程脱离
原型
int shmdt(const void *shmaddr);
参数
shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段

 


shmctl函数


功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

Linux操作系统——第四章 进程间通信


 注意:共享内存没有进行同步与互斥文章来源地址https://www.toymoban.com/news/detail-485354.html


进程互斥


  • 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥
  • 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
  • 在进程中涉及到互斥资源的程序段叫临界区
  • 特性方面:IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 

到了这里,关于Linux操作系统——第四章 进程间通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软考数据库】第四章 操作系统知识

    目录 4.1 进程管理 4.1.1 操作系统概述 4.1.2 进程组成和状态 4.1.3 前趋图 4.1.4 进程同步与互斥 4.1.5 进程调度 4.1.6 死锁 4.1.7 线程 4.2 存储管理 4.2.1 分区存储管理 4.2.3 分页存储管理 4.2.4 分段存储管理 4.2.5 段页式存储管理 4.3 设备管理 4.3.1 设备管理概述 4.3.2 I/0软件 4.3.3 设

    2024年02月06日
    浏览(55)
  • 【操作系统复习之路】存储器管理(第四章 &超详细讲解)

    目录 一、存储器的层次结构 二、程序的装入和链接 2.1 逻辑地址和物理地址 2.2 绝对装入方式 2.3 可重定位装入方式 2.4 动态运行时装入方式 2.5 静态链接  2.6 装入时动态链接 2.7 运行时动态链接 三、连续分配存储器管理方式 3.1 单一连续分配 3.2 固定分区分配 3.3 动态分区

    2024年04月27日
    浏览(39)
  • 操作系统考试复习——第四章 存储器管理 4.1 4.2

    存储器的层次结构: 存储器的多层结构: 存储器至少分为三级:CPU寄存器,主存和辅存。 但是 一般分为6层 为寄存器,高速缓存,主存储器,磁盘缓存,固定磁盘,可移动存储介质。 这几个部分是 速度依次减小 但是 存储容量是依次增大 的。  只有固定磁盘和可移动存储

    2024年02月03日
    浏览(42)
  • 【 Linux命令行与Shell脚本编程】第四章 进程管理 ,磁盘统计信息,挂载新磁盘,数据排序,数据归档

    第四章 更多命令 进程管理 磁盘统计信息 挂载新磁盘 数据排序 数据归档 4.1,监测程序 4.1.1,ps 探查进程 4.1.2,top 实时监测进程 4.1.3,kill pkill 结束进程 1,kill 命令 2,pkill 命令 4.2,检测磁盘空间 4.2.1,mount umount挂载存储设备 1. mount 命令 其他选项 2,umount 命令 4.2.2, df 命令 4.2.3, du 命令

    2023年04月24日
    浏览(49)
  • 第四章 HFSS建模操作

    基本物体模型的选择都可以通过菜单栏Draw完成 2-1 创建长方体、两种方法创建模型位置和大小 建模前: 确定建模单位 :Modeler Units 确认当前工作平面:XY平面 建模时: 方法一:通过状态栏输入模型的准确位置坐标及大小尺寸 确定长方体顶点坐标 并按回车确定 确定长宽高

    2024年02月01日
    浏览(37)
  • 云计算工程师系列 Day04 第四章 进程管理(超详细 持续更新中....)

    简介:Linux系统Centos7中程序的相关概念。进程管理工具pstop的用法。kill控制进程。job控制作业的相关方式。 目标:掌握程序概念 掌握进程管理工具的使用/控制进程的方法 (1)灵魂三问 01.我是谁? 什么是进程 02.我从哪里来?进程从哪来 03.我要上哪去?进程上哪去 (2)进

    2024年01月25日
    浏览(39)
  • spark第四章:SparkSQL基本操作

    spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 spark第四章:SparkSQL基本操作 接下来我们学习SparkSQL他和Hql有些相似。Hql是将操作装换成MR,SparkSQL也是,不过是使用Spark引擎来操作,效率更高一些 以上是这次博客需要的所有依赖,一次性全加上。 一共

    2024年02月07日
    浏览(41)
  • Linux第四章

    ctrl+c :强制停止(Linux某些程序的运行;命令输入错误) ctrl+d :退出或登出(退出账户的登录;或者退出某些特定程序的专属页面) history :查看历史输入过的命令(!命令前缀,自动执行上一次匹配前缀的命令,不能搜索太久的) ctrl+r :输入内容去匹配历史命令(如果搜索到的内

    2024年02月01日
    浏览(43)
  • linux第四章(网络)

    在配置前首先查看本机的ensXX信息:cat ens160.nmconnection 看本机配置:cd /etc/NetworkManager/                       cd  system-connextions/    ls 一。接口管理命令:ip命令/nmcli命令/nmtui命令 1.对IP地址进行操作: ip的命令: IP link:显示网络设备的运行状态 ip -s show ens160:查看设备(en

    2024年01月19日
    浏览(48)
  • 第四章:数据操作Ⅰ 第二节:读写CSV文件

    使用read.csv函数,可以将CSV文件读入数据框,而使用write.csv()函数,则可以将数据框保存到CSV中 我们使用read.csv()的时候,其会返回一个数据框 例如: 例如:读取学分文件(以下为待读取文件)  使用head格式到R语言中取前面数据  使用tail格式到R语言中取后面数据  例如:

    2024年03月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包