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

来源:互联网 发布:java格式化毫秒时间戳 编辑:程序博客网 时间:2024/06/06 02:07
 

一、管道通信的实质

这部分学习参考此博客

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:菜鸟一只,欢迎相互学习探讨交流。不足之处还请指出。

原创粉丝点击