每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程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