Linux进程间通信(一)管道
2016-01-31 14:25
633 查看
一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。
管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
管道通信-特点
管道通讯是单向的,有固定的读端和写端。
数据被进程从管道读出后,在管道中该数据就不存在了。
当进程去读取空管道的时候,进程会阻塞。
当进程往满管道写入数据时,进程会阻塞。
管道容量为内核定义的(#define PIPE_BUFFER include/linux/pipe_fs_i.h)
无名管道
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,因此可以使用read,write,close等函数来访问无名管道。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。
管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
管道通信-特点
管道通讯是单向的,有固定的读端和写端。
数据被进程从管道读出后,在管道中该数据就不存在了。
当进程去读取空管道的时候,进程会阻塞。
当进程往满管道写入数据时,进程会阻塞。
管道容量为内核定义的(#define PIPE_BUFFER include/linux/pipe_fs_i.h)
无名管道
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,因此可以使用read,write,close等函数来访问无名管道。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。
#include <unistd.h> #include <string.h> #include <stdio.h> #include <sys/wait.h> #include <stdlib.h> int main(int argc, char *argv[]) { pid_t pid; int pipefd[2]; char buf; if(argc != 2) { fprintf(stderr,"Usage: %s <string>\n",argv[0]); exit(EXIT_FAILURE); } if(pipe(pipefd) == -1) //pipe需要在fork前调用 { perror("pipe error"); exit(EXIT_FAILURE); } if((pid = fork()) < 0) { perror("fork error"); exit(EXIT_FAILURE); } else if(pid == 0) /* child reads from pipe */ { close(pipefd[1]); /* close unused write end */ while(read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); _exit(EXIT_SUCCESS); } else /* parent writes argv[1] to pipe */ { close(pipefd[0]); /* close unused read end */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); waitpid(pid,NULL,0); exit(EXIT_SUCCESS); } }
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍