首页 > 系统相关 >Linux之进程间通信

Linux之进程间通信

时间:2024-03-31 22:58:18浏览次数:24  
标签:返回 System 间通信 管道 Linux 进程 匿名 共享内存

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

进程间通信的本质:让不同的进程看到同一份“资源”。 

2.进程间通信分类
管道
匿名管道 pipe 命名管道
System V IPC
System V 消息队列 System V 共享内存 System V 信号量
POSIX IPC
消息队列 共享内存 信号量 互斥量 条件变量 读写锁

 下面只详细介绍匿名管道,命名管道,System V共享内存。

管道

管道是单向通信的,管道是基于文件的,生命周期随进程

管道提供的是面向“流”式通信的,管道提供了访问控制。

3.匿名管道

fd :文件描述符数组 , 其中 fd[0] 表示读端 , fd[1] 表示写端 (可以把0理解成嘴巴(读),把1理解成笔(写)) 返回值 : 成功返回 0 ,失败返回错误代码

匿名管道原理图 

匿名管道是让具有“血缘关系”的进程进行通信的。

创建完匿名管道之后,让父进程关闭"读",让子进程关闭“写”,这样就实现了“一个读,一个写”。

父子进程通过匿名管道进行通信,通信的内容没必要进行刷盘(持久化)。

当管道内没有数据,read会阻塞

当管道被写满,write会阻塞

当写端fd关闭,read返回0

当读端fd关闭,write操作会产生SIGPIPE信号,进而导致write退出

当要写入的数据量大于PIPE_BUF时,linux将不能保证写入的原子性

当要写入的数据量不大于PIPE_BUF时,linux能保证写入的原子性

4.命名管道

匿名管道的限制条件之一是具有“血缘关系”的进程之间进行通信,要想两个不相关的进程能进行通信 ,可以使用FIFO文件,即命名管道。

指明要在哪个路径下创建名为XXX的文件,并指明文件对应的权限,通过调用mkfifo创建该文件。

命名管道原理图

由于是在磁盘上创建有名字文件,这点就是和“匿名管道”的区别。

当然,该文件被加载到内存后,进程可以通过指定路径和指定文件名找到该文件,通过该文件进行进程间通信的内容,也不必刷新到磁盘中。

5.System V共享内存

System V共享内存原理图

System V共享内存进行通信比管道快,是因为数据拷贝次数少。

共享内存有关的函数
ftok

该函数是通过指定路径下的文件名,以及一个整数,系统来创建一个随机的key_t类型的值。

通过调用该函数,让不同的进程能创建出相同的key_t 类型的值(即为让不同进程看到同一份“资源”做铺垫)。

shmget

功能:用来创建共享内存

第一个参数是ftok函数创建的随机值,第二个参数是共享内存的大小(建议设置为4096的整数倍),第三个参数如果设置为IPC_CREAT(如果存在,则获取之,如果不存在,则创建),如果设置为IPC_CREAT  |   IPC_EXCL ,(如果不存在,则创建,如果存在,则出错返回)

返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回 -1
shmat

功能:建立共享内存段到进程地址空间之间的映射 参数 shmid: 共享内存标识 shmaddr:指定连接的地址 shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY 返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
shmdt

功能:将共享内存段与当前进程之间的映射去掉 参数 shmaddr: 由shmat所返回的指针 返回值:成功返回0;失败返回-1 注意:将共享内存段与当前进程脱离不等于删除共享内存段
shmctl

功能:用于控制共享内存 参数 shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作,其中填写  IPC_RMID  用来删除共享内存 buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值:成功返回0;失败返回-1

其中,struct shmid_ds的结果如下: 

 

标签:返回,System,间通信,管道,Linux,进程,匿名,共享内存
From: https://blog.csdn.net/wmh_1234567/article/details/137209606

相关文章

  • Linux下查询文件夹中文件数量的方法
    linux统计文件个数的方法:1、查看路径下文件的个数,代码为【ls-l|grep"^-"|wc-l】;2、查看路径下文件夹的个数,代码为【ls-l|grep"^d"|wc-l】。本教程操作环境:windows7系统、linux7.3版本,该方法适用于所有品牌电脑。推荐:linux视频教程linux统计文件个数的方法:对于linu......
  • 【Linux】详解软硬链接
    一、软硬链接的建立方法1.1软链接的建立假设在当前目录下有一个test.txt文件,要对其建立软链接,做法如下:ln就是link的意思,-s表示软链接,test.txt要建立软链接的文件名,后面跟上要建立的软链接文件名。 其中我们可以发现,建立出来的这个软链接文件是一个独立的文件,因为我们可......
  • 【Linux】详解文件系统以及周边知识
    一、磁盘的基本知识        磁盘中可以被划分成一个一个的环,每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区,扇区是磁盘IO的基本单位(想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中)。磁盘中的盘面,磁道和扇区都是有编号的。要访问一......
  • 1.1.1、操作系统发展史、Linux 与 Unix
    关注公众号“融码一生”,领取全套PDF/电子书Linux是众多操作系统之一,常见操作系统:win7、win10、Mac、Android、IOS。计算机是一台按用户要求接收信息、存储与处理数据,再将处理结果输出(文字、图片、音频、视频等)的机器。计算机由硬件和软件组成:硬件是计算机赖以工作......
  • Linux应用开发笔记(一)交叉编译及执行
    Linux应用开发笔记(一)交叉编译及执行文章目录一、GCC编译器1.什么是GCC2.安装GCC3.交叉编译二、ssh的使用1.连入局域网2.连接SSH一、GCC编译器1.什么是GCCGCC(GNUCompilerCollection)是一个开源的编译器集合,包含C、C++、Objective-C、Fortran、Java、Ada和G......
  • linux常用内核优化
    linux内核常用调优参数点击关注......
  • Linux文件查找
    1.文件查找:which+空格文件名          locate+空格文件名(若创建新文件查找不到,需要用updateab加回车键)          find+空格路径+空格-iname(-name)+表达式(文件的大致名字,或者文件放的位置)注:若用-iname可以不分大小写    ......
  • linux内存管理2
    1.LVM:管理磁盘的一种方式,与基本磁盘无异。  特点:随意扩张大小2.PV:将物理磁盘转变为物理卷     pvcreate+空格文件磁盘名(创建物理卷)     pvs(查看物理卷)  VG:卷组,里面有多个物理卷组成     vgcreate+空格卷组名++空格+磁盘名 ......
  • linux命令--make -j和make all
    目录一 make-j和makeall区别二实例说明(一)make-j 的例子makeall 的例子结合使用三实例说明(二)**`make`****`makeall`**四makeall可以用make-j替换吗一 make-j和makeall区别make-j和makeall在Linux编译过程中各自扮演了不同的角色,具有不同的功能......
  • linux下设置环境变量导致原有环境变量失效
    搭建集群时,想新增一个环境变量,但设置错了导致原因都失效了vim/etc/profile.d/my_env.shexportPATH=/home/atguigu/bin大部分命令都使用不了了,只能使用halp下的命令[root@hadoop102module]#subash:su:未找到命令[root@hadoop102module]#lsbash:ls:未找到命令......