1.进程间通信 : 进程之间交换数据必须通过内核, 在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, 进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
2。进程的用户空间相互隔离, 内核空间相互共享
3.管道的长度: 64K
4.使用mkfifo * 来新建一个管道文件
5.有名管道 : 用于无亲缘关系进程的通信,和有亲缘关系进程的通信。
无名管道:用于有亲缘关系进程的通信
6.管道 :是一种最基本的IPC机制, 由pipe创建
函数原型 : #include <unistd.h>
int pipe(int filedes[2]);
filedes[0] : 指向管道的读端 filedes[1] : 指向管道的写端
注意 ; 两个进程通过一个管道只能实现单向通信
管道的读写端通过打开的文件描述符来传递, 因此要通信的两个进程必须从他们的公共祖先那里继承管道文件描述符
使用管道需要注意一下四种特殊情况(假设都是阻塞I/O操作, 么有设置O_NONBLOCK标志):
(1)如果所有指向管道写端的文件描述符都关闭了(写端的引用计数是0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样
(2)如果所有指向管道写端的文件描述符么关闭, 而持有管道写端的进程也么有向管道中写数据, 这时有进程从管道读端读数据那么管道中的剩余数据被读取后,再次read,会阻塞,知道管道中有数据可读了读取数据并返回
(3)如果所有指向管道读端的文件描述符都关闭了, 这时有进程向管道的写端write, 那么该进程会收到信号SIGPIPE, 通常会导致进程异常终止
(4)如果有指向管道读端的文件描述符没有关闭, 而持有管道读端的进程也没有从管道中读数据, 这时有进程向管道写端写数据,那么在管道被写满后,再次write阻塞, 知道管道中有空位置了才写入数据并返回。
7.
I.管道需要在内核和用户空间进行四次的数据拷贝,
而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。
II.管道用循环队列实现,连续传送数据可以不限大小;
共享内存每次传递数据大小是固定的
。 III.共享内存可以随机访问被映射文件的任意位置,管道只能顺序读写。
IV.管道可以独立完成数据的传递和通知机制;
共享内存需要借助其他通讯方式进行消息传递。
英语: IPC (InterProcess COmmunication) 进程间通信