Linux-进程间通信(一): 管道
2016-03-19 21:45
423 查看
1. 管道局限性:
(1) 半双工;(若模拟全双工,可以使用两个管道,即,proc1-->proc2一条管道,proc2-->proc1一条管道)
(2) 只能在具有公共祖先的进程之间使用;
2. 管道创建函数:
经由filedes返回两个文件描述符:filedes[0]为读端,filedes[1]为写端;
3. 惯用方式:
由于单个进程中的管道并没有任何用户,所以,通常调用pipe的进程会接着调用fork,这样就创建了从父进程到子进程(或相反)的IPC通道;
比如为了创建从子进程到父进程的管道,子进程关闭读端fd[0],父进程关闭写端fd[1];
4. 一端关闭影响:
(1) 读一个写端已经被关闭的管道,数据被读取完毕后,会读到一个文件结束符,read返回0;
(2) 写一个读端已经被关闭的管道,会产生SIGPIPE信号;
5. 管道测试:从父进程向子进程传递数据
(1) 半双工;(若模拟全双工,可以使用两个管道,即,proc1-->proc2一条管道,proc2-->proc1一条管道)
(2) 只能在具有公共祖先的进程之间使用;
2. 管道创建函数:
#include <unistd.h> int pipe (int filedes[2]); ret = 0-成功 -1-失败
经由filedes返回两个文件描述符:filedes[0]为读端,filedes[1]为写端;
3. 惯用方式:
由于单个进程中的管道并没有任何用户,所以,通常调用pipe的进程会接着调用fork,这样就创建了从父进程到子进程(或相反)的IPC通道;
比如为了创建从子进程到父进程的管道,子进程关闭读端fd[0],父进程关闭写端fd[1];
4. 一端关闭影响:
(1) 读一个写端已经被关闭的管道,数据被读取完毕后,会读到一个文件结束符,read返回0;
(2) 写一个读端已经被关闭的管道,会产生SIGPIPE信号;
5. 管道测试:从父进程向子进程传递数据
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_SIZE 64 int main(int argc, char *argv[]) { int n; int fd[2]; pid_t pid; char line[MAX_LINE_SIZE]; if (pipe(fd) < 0){ perror("pipe error"); return -1; } if ((pid = fork()) < 0){ perror("fork error"); return -1; } else if (pid > 0){ close(fd[0]); char * test_string = "hello world~\n"; write(fd[1], test_string, strlen(test_string)); wait(NULL); close(fd[1]); } else { close(fd[1]); n = read(fd[0], line, MAX_LINE_SIZE); write(STDOUT_FILENO, line, n); close(fd[0]); } return 0; }
相关文章推荐
- 与一线Linux嵌入式开发工程师的对话
- Linux 运行级别
- CentOS通过删除旧内核解决/boot空间不足的问题
- Linux操作系统下的三种Java环境配置方法
- 《Linux内核分析》 第四周
- linux之sed命令
- 2013337朱荟潼 Linux第五章读书笔记——系统调用
- Linux下cpuinfo详解
- linux grep 和 find 命令
- 从事LINUX驱动或者是安卓驱动工作的话,初学者应具备哪些专业技能呢?
- Linux启动流程
- Linux下sqlplus显示乱码
- linux下导入、导出mysql数据库命令
- Linux字符驱动开发学习总结
- Linux程序管理之rpm,yum,编译安装详解
- Linux ./configure --prefix 命令是什么意思?
- debian ubuntu linux系好用的包管理工具 aptitude
- Linux 文件传输 lrzsz,scp
- CentOS6.5中修改yum源
- linux下文件的复制、移动与删除