进程间通信——管道错误总结

本文详细讨论了进程间通信的不同方式,如管道、共享内存、消息队列和信号量,强调了它们在数据传输、地址映射和同步机制方面的特点,指出共享内存因其直接访问速度最快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 典型进程间通信方式:管道,共享内存,消息队列,信号量,网络通信,文件等多种方式

  2. 进程A读取B进程中的某个变量(非共享内存),可行的方式有()[多选]
    A.B进程向消息队列写入一个包含变量内容的消息,A进程从队列中读出
    B.通过本地网络通信
    C.如果A、B 非亲属,那么A通过命名管道把这个变量的地址发给B进程
    D.如果 B是A 进程的子进程,那么B直接读取变量内容即可

A正确: 消息队列实现数据传输
B正确: 本地网络通信实现数据传输
C错误: 命名管道实现数据传输,但是传递地址错误,因为每个进程有自 己独立的虚拟地址空间(A的地址B经过自己的页表映射就不知道映射到哪了)
D错误: 父子进程数据独有,各自有自己的虚拟地址空间和数据,因此无法直接读取

  1. 管道的通信本质是通过内核中一块缓冲区(内存)时间数据传输,而命名管道管道文件只是一个标识符,用于让多个进程能够访问同一块缓冲区

  2. 管道的生命周期随进程,本质是内核中的缓冲区,命名管道文件只是标识,用于让多个进程找到同一块缓冲区,删除后,之前已经打开管道的进程依然可以通信

  3. 共享内存是将同一块物理内存映射到各个进程虚拟地址空间,可以直接通过虚拟地址访问,相较于其它方式少了两步内核态与用户态之间的数据拷贝因此速度最快(并且共享内存可以提供较大空间)

管道是通过read,write系统调用进行通信的,存在用户态和内核态的转变,但是共享内存是不需要系统调用,直接使用链接上的共享内存就行

请添加图片描述

  1. 以下描述正确的有
    A.共享内存实现通信的原理是因为所有进程操作映射同一块物理内存
    B.共享内存的操作是进程安全的
    C.共享内存被删除后,则其它进程直接无法实现通信
    D.所有进程与共享内存断开映射后,则共享内存自动被释放

A正确,共享内存的本质就是开辟一块物理内存,让多个进程映射同一块物理内存到自己的地址空间进行访问,实现数据共享的。
B错误,共享内存的操作是非进程安全的,多个进程同时对共享内存读写是有可能会造成数据的交叉写入或读取,造成数据混乱
C错误,共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,表示没有进程访问了,才会真正被删除
D错误,共享内存生命周期随内核,只要不删除,就一直存在于内核中,除非重启系统(当然这里指的是非手动操作,可以手动删除)

  1. ipcs 查看进程间通信资源/ipcrm 删除进程间通信资源
选项操作
-m共享内存
-q消息队列
-s信号量
-a所有资源

同步机制
没有提供同步机制——共享内存
提供同步机制——匿名,命名管道,消息队列
管道同步机制体现在open的时候,只有两端都打开的时候才能往后运行代码,否则就会卡住

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值