管道的基本原理
将一个进程的输出作为另一个进程的输入,将数据流从一个进程传递到另一个进程。在Unix或类Unix系统中,管道通常是通过操作系统内核中的一个缓冲区实现的,其输入和输出被映射到两个文件描述符上。一个进程通过向管道写入数据,另一个进程通过从管道读取数据,从而实现数据的传输。在实现上,管道可以是基于内存的匿名管道或基于文件系统的命名管道。实为内核使用环形队列机制,借助内核缓冲区(4k)实现。
管道的创建:
int pipe(int pipefd[2]); 定义在unistd.h//用于创建匿名管道,基于内存,只能在创建它的进程及其子进程之间使用,无法在其他进程之间共享。
我们使用匿名管道前会先调用fork创建子进程,管道也会复制一份,因此达到通信
通常我们用fd[0]用于读,fd[1]用于写
简便记忆:
1是管道头输入数据所以写,0是管道尾输出数据所以我们读,由此可知管道是半双工通信
int mkfifo(const char*filename,mode_t mode); 包含头文件sys/types.h和sys/stat.h
与打开open类似,//用于创建命名管道,基于文件,与匿名管道相反,但速度不如匿名管道