
1. 为什么需要 IPC每个进程都有自己独立的虚拟地址空间一个进程无法直接访问另一个进程的内存。但实际开发中进程之间经常需要共享数据或交换信息例如父进程把任务分发给子进程子进程把结果回传给父进程多个进程协作处理同一份数据一个进程负责采集数据另一个进程负责计算或落盘。这种「进程之间传递数据、同步状态」的机制统称为IPCInter-Process Communication进程间通信。2. IPC 的常见种类古老的通信方式无名管道pipe、有名管道FIFO、信号signalSystem V / POSIX IPC共享内存、消息队列、信号量集网络通信socket既能本机通信也能跨主机通信。本文重点梳理管道这一类也就是无名管道和有名管道。3. 无名管道pipe无名管道 》pipe 》只能给有亲缘关系进程通信管道的特性1、管道是 半双工的工作模式 实际编程使用会当单工使用。2、所有的管道都是特殊的文件不支持定位操作。lseek- fd fseek -FILE*3、管道是特殊文件读写(首选)使用文件IO open,read,write,close; 可选(标准io带缓存区)fgets,fread,fgetc,编程顺序创建管道 》fork–读写管道 》关闭管道读端与写端1,读端存在一直向管道中去写超过64k写会阻塞 写段写的太快2,写端是存在的读管道如果管道为空的话读会阻塞。 读段读的太快3,管道破裂读端关闭写管道会导致写段退出4, read 0 ,写端关闭如果管道没有内容read 0 进程间通信结创建无名管道函数int pipe(int pipefd[2]);功能创建并打开一个无名管道参数pipefd[0] 无名管道的固定读端pipefd[1] 无名管道的固定返回值成功 0失败 -1代码示例4. 有名管道FIFO4.1 为什么需要有名管道无名管道只能用于亲缘进程一旦两个进程毫无关系比如两个独立启动的程序就无法共享同一个管道。有名管道在文件系统中有一个路径名任何进程只要知道这个路径就能打开它进行通信。4.2 特点在文件系统中以特殊文件形式存在用 ls -l 可以看到类型为 p可以用于任意进程之间通信不要求亲缘关系数据同样存在于内核缓冲区进程退出后数据消失依然是单向的需要双向通信时通常创建两个 FIFO打开 FIFO 时读端和写端会互相阻塞等待对方打开除非使用 O_NONBLOCK。有名管道 》fifo 》可以给任意单机进程通信 .有文件名称的管道。文件系统中可见和无名管道特性一致。 额外的 如果有一端没有打开则默认在open函数部分阻塞编程步骤 创建有名管道 》打开有名管道 》读写管道》关闭管道 》卸载有名管道有名管道的函数int mkfifo(const char *pathname, mode_t mode);功能在指定的pathname路径名称下创建一个权限为mode的有名管道文件。参数pathname要创建的有名管道路径名称mode 8进制文件权限。返回值成功 0失败-1有名管道间传输png文件代码示例1.读端代码2.写端代码5. 无名管道与有名管道对比对比项无名管道 pipe有名管道 FIFO是否有名字无有存在于文件系统适用进程仅亲缘进程任意进程创建方式pipe()mkfifo() 或 mkfifo命令数据存储内核缓冲区内核缓冲区通信方向单向单向生命周期随进程关闭而消失文件节点保留需手动删除无名管道适合父子进程之间简单、临时的数据传递使用简单但受限于亲缘关系有名管道通过文件系统路径解耦了进程关系适合两个独立程序之间的通信两者都是单向字节流需要双向通信时要成对使用或者考虑 socketpair、共享内存等方案。