进程间通信(IPC)-管道、匿名管道

     每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读出,内核提供的这种机制称为进程间通信。

管道:基本的IPC机制由int pipe(filedes[2])函数创建,调用函数在内核开辟一段缓冲区(管道)用于通信,它有一个读端一个写端,然后 通 过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端,管道从用户角度看相当于打开一个文件,向文件读写数据其实是在读写内核缓冲区。

 

管道的读写端需要打开文件描述符来传递,所以进程需要从公共祖先哪里继承文件描述符,所以通过管道通信需要有血缘关系。

进程通过管道只能单向通信,有时需要父进程读,子进程写,有时需要子进程读,父进程写这就需要重新开管道。

 管道:

命名管道

文件系统中路径名是全局的,每个进程都可以访问,可以用文件系统中的路径名来标识一个IPC通道

创建FIFO文件函数

int mkfifo(const char *filename, mode_t mode);

匿名管道:

fifo写端

fifo读端:

管道的容量

当管道一端不断地读取数据,另一端却不输出数据。根据linux的实现机制当管道读满是输出端自动阻塞。所以这个管道是有大小的

现在我们编写程序来测试管道的大小

 当i=16的时候会阻塞,可知管道大小为64k

原文地址:https://www.cnblogs.com/Blog-day/p/My_Blog_Days_22.html