linux应用编程笔记(9)无名管道编程
来源:互联网 发布:广数g72内孔编程实例 编辑:程序博客网 时间:2024/06/05 19:37
摘要: 总结了Linux下进程通讯目的,通讯方式,IPC的概念,分析了管道和无名管道的使用方法,最后通过一个实例加深理解!
一、Linux进程通讯目的
Linux是一个多进程系统,各个进程之间会存在通讯的问题,通讯的目的有以下几种:
1.数据传输
一个进程需要将数据发送给另一个进程。
2.资源共享
多个进程可能会共享同一块内存上的数据。
3.通知事件
一个进程需要向别的进程发送消息,告诉他们发生了什么事件。
4.进程控制
有些进程希望控制其他进程的执行状态,例如DEBUG进程,此时该进程希望可以拦截其他进程的所有操作,并时刻知道它的状态。
其实说白了,上面的四个我认为都是一个道理,那就是进程之间的“数据传递”,无论是数据传输,资源共享,通知事件或者进程控制,他们之间都存在一个数据流的交互,只是模式不同,功能不同罢了。
二、IPC
IPC的扩展名是:interprocess communication,是由unix进程间通信,基于system V进程间通信和posix进程间通信发展而来。其,POSIX(Portable Operating SystemInterface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发 POSIX 标准,是为了提高UNIX 环境下应用程序的可移植性。许多其他的操作系统,例如windows也是支持posix的。
三、Linux进程间的通讯方式
主要有以下七种:
1.无名管道(pipe)
2.有名管道(FIFO)
3.消息队列(msg*)
4.共享内存(shm*)
5.信号量(sem*)
6.信号(signal)
7.套接字(socket)
四、管道通信及无名管道
一个进程在管道的写端写入数据,另一个进程在管道的读端读走数据,就像一根管道,一个人一边,写的人往里扔一个球,读的人在另一边拿走,读走了就没有了。
管道包括无名管道和有名管道,无名管道只能用于父子进程之间的通信,有名管道可以用于同一系统中任意两个进程之间的通信。
1.管道通讯是单向的,有固定的读端和写端。
2.数据被进程从管道读出后,在管道中该数据就不存在了。
3.当进程去读取空管道的时候,进程会阻塞。
4.当进程往满管道写入数据时,进程会阻塞。
5.管道容量为64KB(#define PIPE_BUFFERS 16
include/linux/pipe_fs_i.h)
6.在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,我们可以使用read,write,close方式来进行访问操作。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。
五、无名管道操作函数
1.创建管道
函数原型:int pipe(int pipefd[2])
函数作用:创建一个无名管道
头文件:include <unistd.h>
函数参数:pipefd[0]存放返回的管道读端的文件句柄,pipefd[1]存放返回的管道写端的文件句柄
返回值:
成功:返回管道两端的文件句柄存放在pipefd数组中,函数的返回0
失败:函数返回-1,pipefd中不会有文件句柄
2.关闭管道
写端close(pipefd[1]),读端close(pipefd[0])
3.读管道
read(pipefd[0],buf,count)
4.写管道
write(pipefd[1],buf.count)
<span style="font-size:18px;">例程:mypipe.c#include <stdio.h>#include <unistd.h> int main(void){ pid_tpid=0; intpipefd[2]; charbuf1[20]={"this is buf1"}; charbuf2[20]; /*创建管道*/ if(pipe(pipefd)<0) { perror("creatpipe fault!\n"); exit(1); } /*创建子进程*/ pid=fork(); /*写管道*/ if(pid>0) { write(pipefd[1],buf1,20); wait(); close(pipefd[1]); exit(0); } /*读管道*/ else { read(pipefd[0],buf2,20); printf("%s\n",buf2); close(pipefd[0]); exit(0); } return0; }运行结果为:#this is buf1</span>
这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!
- linux应用编程笔记(9)无名管道编程
- Linux无名管道编程
- linux应用开发-无名管道编程
- linux应用编程--pipe无名管道
- linux下c编程之无名管道pipe()函数
- 【Linux系统编程】进程间通信--无名管道(pipe)
- linux 进程编程:无名管道pipe
- 无名管道通讯编程
- linux应用编程笔记(10)有名管道编程
- linux管道(无名管道)
- Linux编程练习 --进程间通信1--无名管道
- Linux编程—进程间通信—无名管道(1)
- Linux编程练习 --进程间通信1--无名管道
- Linux编程 进程间通信------无名管道(PIPE)
- Linux编程基础之进程间通信之一:无名管道
- Linux编程学习之进程间通信篇-无名管道
- linux编程---进程间通信---PIPE---无名管道
- 无名管道与有名管道通讯编程
- zabbix监控tomcat
- Ubuntu上编译hostapd
- 获取Jar包版本的简单方法
- 面试遇到的局部与全局
- 关于微信加解密illegal key size问题
- linux应用编程笔记(9)无名管道编程
- 数据库三范式
- B树、B+树、B*树
- Myeclipse中如何修改svn用户名密码
- spring 多数据源注解事务使用
- Android学习笔记 13 Broadcast & Service(part.1)
- Ubuntu 目录操作--未完成
- 【转】10年软件测试工作总结
- Java Web Filter 详解