LINUX 进程通信之匿名管道

2019-07-14 10:23发布

(一)管道的创建 管道是一种最基本的IPC机制,由pipe函数创建: #include int pipe ( int filedes[2] ); pipe函数需要一个形参(一个含有2个整型元素的数组),创建成功返回0,失败返回-1
该函数本质原理: 当父进程创建子进程,子进程则按照父进程的PCB进行部分拷贝形成自己的PCB。在父进程的PCB中含有一个叫做files_struct的结构,而这个结构中主要内容就是包含了该进程打开的所有文件的地址,即一个指针数组(默认情况下打开三个文件,标准输入,标准输出,标准错误,分别对应指针数组下标为0, 1, 2的元素,下标即是文件描述符)。当父进程调用pipe函数,则会在内核中开辟一块缓冲区用于通信,并且它含有一个读端一个写端,则在files_struct中多了两个元素对应着打开的文件地址在files_struct中的该管道的读端和写端,当父进程创建子进程,则files_struct也被拷贝一份到子进程的PCB,那么父子进程就看到了一份公共资源 打开的文件地址在files_struct中的规则: 改地址存放在files_struct指针数组中未使用的最小的元素

(二)代码实现
#include #include #include int main() { int array[2] = {0}; int key = pipe(array); if(key < 0){ perror("pipe"); return -1; } pid_t ret = fork(); if(ret < 0){ // shi bai perror("fork"); return -2; }else if(ret == 0){ //child -> read close(array[1]); int count = 5; char buf[128]; while(count--) { ssize_t _s = read(array[0], buf, sizeof(buf)-1); if(_s < 0){ perror("write"); return -4; }else{ buf[_s] = '