进程间通信之管道pipe
2015-04-09 15:27
330 查看
管道用于具有亲缘关系的进程之间的通信,又称匿名管道,以与命名管道区分。
通过管道的通信数据遵循“先进先出”原则,并且是单向通信,因此若有两个进程需要双向通信,则至少需要建立两个管道。
“具有亲缘关系的进程”是指父进程与子进程,或者父进程派生的2个子进程。
下面就直接上代码演示两个兄弟进程之间通过匿名管道传递数据:
来看一下运行结果:
和代码对应起来一起看:
父进程进程号是25192,派生了2个进程,一个往pipe中写入自己的进程号,另外一个子进程从pipe中读出兄弟进程的进程号,并打印出来。
只有具有亲缘关系的进程才能通过fork共享文件打开表,而不同进程打开文件表最终指向的是同一个系统文件打开表,才实现了数据流的传递。
通过管道的通信数据遵循“先进先出”原则,并且是单向通信,因此若有两个进程需要双向通信,则至少需要建立两个管道。
“具有亲缘关系的进程”是指父进程与子进程,或者父进程派生的2个子进程。
下面就直接上代码演示两个兄弟进程之间通过匿名管道传递数据:
[code]#include <stdio.h> int main() { int fdset[2]; int id; if(-1 == pipe(fdset)) { perror("pipe error\n"); return 0; } if(!fork()) { id = getpid(); printf("I am child writer pid:%d parent:%d\n", id, getppid()); write(fdset[1], &id, sizeof(int)); } else if(!fork()) { read(fdset[0], &id, sizeof(int)); printf("I am child reader pid:%d parent:%d. My brother pid:%d\n", getpid(), getppid(), id); } else { printf("I am parent pid:%d\n", getpid()); } sleep(2); close(fdset[0]); close(fdset[1]); printf("Bye from pid:%d\n", getpid()); return 0; }
来看一下运行结果:
[code]test@test:~$ gcc main.c test@test:~$ ./a.out I am parent pid:25192 I am child writer pid:25193 parent:25192 I am child reader pid:25194 parent:25192. My brother pid:25193 Bye from pid:25192 Bye from pid:25193 Bye from pid:25194
和代码对应起来一起看:
父进程进程号是25192,派生了2个进程,一个往pipe中写入自己的进程号,另外一个子进程从pipe中读出兄弟进程的进程号,并打印出来。
只有具有亲缘关系的进程才能通过fork共享文件打开表,而不同进程打开文件表最终指向的是同一个系统文件打开表,才实现了数据流的传递。
相关文章推荐
- 进程间通信(一): 管道(pipe+fifo)
- 练习--LINUX进程间通信之无名管道PIPE
- Linux进程间通信——管道 pipe 详解
- Linux进程间通信方式之管道(pipe)
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
- 【Linux0.11 内核源码剖析】进程间通信——管道(pipe)
- 进程间通信:管道(pipe)
- 进程间通信1—管道(pipe)和命名管道(FIFO)
- Linux进程间通信之管道(pipe)
- 21、Windows API 进程间通信,管道(Pipe)
- Windows API 进程间通信,管道(Pipe)
- 传统的进程间通信方式 1.无名管道(pipe) 2.有名管道(fifo) 3.信号(signal)
- 进程间通信-管道(PIPE)和有名管道(FIFO)
- 1、进程间通信-PIPE(无名管道)
- 进程间通信——管道(Pipe)
- (二十六)进程间通信——pipe管道
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
- Windows API 进程间通信,管道(Pipe)
- Windows API 进程间通信,管道(Pipe)
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)