进程间的通信

这块怎么说呢 ,就是不怎么使用,因为当信息量大的时候,会产生BUG
,但是他还是有点用的,
最重要 且最牛逼 但也比较难 的进程通信为 :网络
为什么要进程通信?
因为 进程具有独立性(每个进程都有自己的虚拟地址空间) ,两个进程 彼此并不直到对方的状态
通讯需要介质,两个进程都能访问的公共资源:
进程间通信可以 :
1 传输数据
2资源共享
3 通知事件
4 进程控制
文件 (共享内存) 消息队列 信号量

进程间通信的分类:

**1 管道(我们把一个进程连接另一个进程的数据流 称为管道)
1 匿名管道 pipe
2 命名管道
2 System V IPC
System V 消息队列
System V 共享内存
System V 信号量

**3 POSIX IPC
消息队列
共享内存
信号量
互斥量
条件变量
读写锁

1 管道
管道是内核中维护的 ,类似队列的一种形式: 单向通行
wc - l 书有多少行
eg ps aux | wc - l
进程间的通信

怎么实现一个管道?
#include“unistd.h”
功能 : 创建无名管道
int pipe(int fd[ 2]);
参数:
fd :文件描述符
fd[0]表示读端
fd[1]表示写端
成功返回 0 失败 返回错误代码
因为管道是内核中维护的,他有一段内存 ,构成了一个队列,因为内核中的内存我们不好管理,我们借用fd来进行读写操作

下面测试一个简单的一对读写
进程间的通信
进程间的通信

发现读写均成功!

管道中的数据一旦被 read,就相当于出队列了;
同一份数据,只有一个进程能读到,因为管道内部具有“”同步互斥机制“”

同步互斥机制 保证多进程同时读写不会出错 ;也保证空管道时,如果尝试读,就在 read处发生阻塞

通信进程间的通信

注意 : 管道的大小只有64 K 即65535 b

匿名管道必须用于具有亲缘关系的进程之间

管道的读写规则

1 同步互斥机制
2 拥塞等待机制

管道的特点:
1 管道提供流式服务
2 一般而言,所有引用管道的进程结束(引用计数),管道释放
3 一般而言,内核对管道的操作进行同步与互斥(多进程同时读写不会错乱,满了发生堵塞等待)
4 管道只能用于具有亲缘关系的进程之间的通信,一般而言,一个管道由一个进程创建,进程内部再调用fork 创建子进程,这样父子进程就可以通信了;
5 管道 半双工通信(数据单向流动),需要双向就用两个管道呗!

创建管道文件 : mkfifo myfile
vim 下
:tabe (tabedit) + filename 打开(创建)标签页
gt 切换到下一个标签页
gT切换到上一个标签页
:q关闭当前标签页
:qa 关闭全部标签页
:set mousa=a 启用鼠标
行内找字符 f +字符 一下就找到了