前言
管道是一种非常古老的进程通信机制,在目前的Linux操作系统中也随处可见,本文我们来探讨一下不同类型管道的机制和使用方法。
原理
在Linux文件系统(一)中我们提到过文件的类型,其中一类文件类型就是管道文件,实际上,管道的实现原理正是借助了文件系统来实现的,下图展示了管道的读写过程。
读进程和写进程分别打开一个file结构体并链接到同一个i-node,通过i-node找到对应数据页进行读写。
PIPE
pipe被称为无名管道,是一种只能用于亲缘关系间的单工通信方法,pipe使用下面的函数创建:
#include <unistd.h>
int pipe(int fd[2]); //成功返回0,失败返回-1
fd数组为传出参数,传出的两个文件描述符fd[1]为读端,fd[0]为写端,通常先调用pipe函数,然后fork出子进程,子进程将继承父进程的文件描述符,因此将集成fd数组,此时将子进程的读端关闭,父进程的写端关闭,就可以从子进程发送消息至父进程,反之则可以从父进程发送消息给子进程,上述过程的代码实现如下:
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int fd[2];
if(pipe(fd)<0){
std::cout << "create pipe failed:" << strerror(errno) << std::endl;
}
pid_t pid = fork();
if(pid<0){
std::cout << "fork failed:" << strerror(errno) << std::endl;
}
else