Linux下管道通信实现A进程死循环输出A后被C进程处理输出C

本文深入讲解了Linux管道通信的基本概念及其实现原理,并介绍了管道通信的局限性。同时,详细解释了fork()、write()与read()三个核心函数的功能与使用方法。最后,通过一个具体的例子展示了如何利用管道进行进程间的通信。

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

 

一、管道通信的实质

这部分学习参考此博客

linux管道pipe详解

 

管道

管道的概念:

 

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

1. 其本质是一个伪文件(实为内核缓冲区)

2. 由两个文件描述符引用,一个表示读端,一个表示写端。

3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

管道的局限性:

① 数据自己读不能自己写。

② 数据一旦被读走,便不在管道中存在,不可反复读取。

③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

④ 只能在有公共祖先的进程间使用管道。

常见的通信方式有,单工通信、半双工通信、全双工通信。

 

二、相关函数

 

 主要介绍三个函数,fork(),write()与read();

 

<1>、fork

     一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,
也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都
复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

 

 

 

<2>.write

1.功能
将数据写入已打开的文件内
2.表头文件
#include<unistd.h>
3.定义函数
ssize_t write (int fd,const void * buf,size_t count);
4.函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。
5.返回值
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。

 

<3>.read

 

1.功能
由已打开的文件读取数据
2.表头文件 
#include<unistd.h>
3.定义函数 
ssize_t read(int fd,void * buf ,size_t count); 
4.函数说明 
read()会把参数fd所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。  
 

三.问题描述

A进程有一个死循环,不停的在终端输出信息“A”。 这个时候,另外一个进程C被创建,尝试将A进程输出的“A”字符修改成“C”。

四。代码实现

五.运行结果

 

PS:菜鸟一只,欢迎相互学习探讨交流。不足之处还请指出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值