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:菜鸟一只,欢迎相互学习探讨交流。不足之处还请指出。
- Linux下管道通信实现A进程死循环输出A后被C进程处理输出C
- Linux下信号通信实现A进程死循环输出A后被C进程处理输出C
- Linux下共享内存通信实现A进程死循环输出A后被C进程处理输出C
- linux下c编程进程通信-管道与信号
- linux c之通过管道实现兄弟间进程通信:
- linux c之通过管道父子进程实现同步通信
- linux c之用命名管道实现进程通信
- Linux C命名管道实现进程间通信
- Linux C 进程间的管道通信
- C/C++:linux进程通信简单例子(管道)
- Linux进程间通信:管道(把管道用作标准输入和标准输出)
- Linux下进程间通信--管道通信
- C语言无名管道实现父子进程间通信
- copy_process.c(采用进程间管道通信方式实现复制)
- C语言创建管道实现进程间通信
- 步步LINUX C--进程间通信(一)管道
- linux进程间的通信(C): 命名管道
- linux进程间的通信(C): 匿名管道
- spring学习
- Bootstrap FileInput中文API整理
- 机器学习全教程
- html和css基础--float属性给父元素带来的问题及方案
- FutureTask使用示例
- Linux下管道通信实现A进程死循环输出A后被C进程处理输出C
- 项目经验--代码设计原则
- ajax使用心得
- Qt动态编译部署
- linux SVN安装
- POJ 2001 Shortest Prefixes(字典树)
- underscore.js 293--409
- hibernate主键生成异常及运行速度慢问题
- -判断链表是否带环?若带环求环的长度?若带环求环的入口点