Linux C 编程----无名管道PIPE
2014-10-20 00:00
281 查看
摘要: 无名管道PIPE
无名管道PIPE特点:
1.它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)
2.它是一个半双工的通信模式,具有固定的读端和写端。
3.管道也可以看成是一种特殊的文件,对于它的读/写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
无名管道函数原型:
filedes[0]读端:用于从管道中读取数据
filedes[1]写端:用于将数据写入管道
若成功则返回零,否则返回-1,错误原因存于errno中。
错误代码:
EMFILE 进程已用完文件描述词最大量
ENFILE 系统已无文件描述词可用。
EFAULT 参数 filedes 数组地址不合法。
注意:
1.不需要open,直接read/write 等系统调用
2.系统自动删除,进程不需要考虑
3.要先PIPE后fork!!!!
使用原理:
进程调用fork之后,子进程也会得到这两个文件描述符,且操作的是同一个管道。这样就在父子进程之间建立了通信连接。
若父进程关闭写端f[1],子进程关闭读端f[0],那么就建立了一条子进程到父进程的单向管道。类似地,还可以建立一条父进程到子进程的单向管道。
与 FIFO" title="pipe 与 FIFO">
如果父进程在fork之前调用了pipe两次,创建了两条管道,那么可以在之后利用上面的方法建立两条半双工管道,一条从子进程读数据,一条向子进程写数据。这样就相当于建立了父子进程之间的全双工管道。
协同进程(coprocess)就是基于这个方法实现的。
简单的例子:
无名管道PIPE特点:
1.它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)
2.它是一个半双工的通信模式,具有固定的读端和写端。
3.管道也可以看成是一种特殊的文件,对于它的读/写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
无名管道函数原型:
#include <unistd.h> int pipe(int filedes[2])
filedes[0]读端:用于从管道中读取数据
filedes[1]写端:用于将数据写入管道
若成功则返回零,否则返回-1,错误原因存于errno中。
错误代码:
EMFILE 进程已用完文件描述词最大量
ENFILE 系统已无文件描述词可用。
EFAULT 参数 filedes 数组地址不合法。
注意:
1.不需要open,直接read/write 等系统调用
2.系统自动删除,进程不需要考虑
3.要先PIPE后fork!!!!
使用原理:
进程调用fork之后,子进程也会得到这两个文件描述符,且操作的是同一个管道。这样就在父子进程之间建立了通信连接。
若父进程关闭写端f[1],子进程关闭读端f[0],那么就建立了一条子进程到父进程的单向管道。类似地,还可以建立一条父进程到子进程的单向管道。
与 FIFO" title="pipe 与 FIFO">
如果父进程在fork之前调用了pipe两次,创建了两条管道,那么可以在之后利用上面的方法建立两条半双工管道,一条从子进程读数据,一条向子进程写数据。这样就相当于建立了父子进程之间的全双工管道。
协同进程(coprocess)就是基于这个方法实现的。
简单的例子:
#include <stdio.h>//printf #include <sys/types.h> //fork---pid_t #include <unistd.h> //fork, pipe #include <string.h> //memset int main(void) { int n, fd[2]; pid_t pid; char line[512]; memset(line, 0, 512); if (pipe(fd) < 0) { printf("pipe error"); } if ((pid = fork()) < 0) { printf("fork error"); } else if (pid > 0) { /* parent */ close(fd[0]); write(fd[1], "hello\n", 13); } else { /* child */ close(fd[1]); n = read(fd[0], line, 215); printf("%s", line); } }
相关文章推荐
- Linux 高级编程 - 无名管道 Pipe
- 【Linux系统编程】进程间通信--无名管道(pipe)
- linux 进程编程:无名管道pipe
- linux下c编程之无名管道pipe()函数
- Linux编程 进程间通信------无名管道(PIPE)
- linux应用编程--pipe无名管道
- linux编程---进程间通信---PIPE---无名管道
- ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 b) 调用fork创建一个子进程 c) 在父进程中向管道写入 “helloworld”, 同时打印出PID和写入
- 通信方式详解,无名管道pipe,有名管道fifo,共享内存share memory,消息队列msg
- Linux进程间通信(一)之无名管道(PIPE)和有名管道(FIFO)
- linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- 无名管道pipe
- 进程间通信--无名管道(pipe)
- UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
- linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- linux 无名管道pipe和有名管道FIFO
- 进程间通信编程(2) - 无名管道
- Linux系统编程——进程间通信:管道(pipe)
- UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
- (转)linux 无名管道pipe和有名管道FIFO