同一主机通信方法:
1、古老的通信方式
无名管道
有名管道
信号
2、IPC对象通信 system v
共享内存*
消息队列
信号量集
跨主机间的通信:
3、socket通信
网络通信
管道-->无名管道、有名管道
无名管道 -->pipe -->只能给有亲缘关系进程通信
有名管道 -->fifo -->可以给任意两个进程通信
管道的特性:
1、管道是 半双工的工作模式
2、所有的管道都是特殊的文件不支持定位操作。
lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写使用文件IO。
open,read,write,close;;
使用框架:
创建管道 --> 读写管道 --> 关闭管道
1.无名管道:
特性:
1.1 亲缘关系进程使用
1.2 有固定的读写端
流程:
1.创建并打开管道: pipe函数
#include <unistd.h>
int pipe(int pipefd[2]);
int pipe(int *pipefd);
int fd[2];
功能:创建并打开一个无名管道
参数:pipefd[0] ==>无名管道的固定读端
pipefd[1] ==>无名管道的固定写端
返回值:成功 0
失败 -1;
2.无名管道的读写:文件IO的读写方式。
读: read()
写: write()
3. 关闭管道: close();
注意:无名管道的架设应该在fork之前进行。
1.写阻塞:
管道中至少有一个读端:
写:
管道中缓存区没有存满则直接写入
管道中缓存区写满则阻塞等待直到有数据读出才能继续写入
2.读阻塞:
管道中至少有一个写端:
读:
有数据时直接读出
没有数据时阻塞等待直到有数据写入才能读出
3.管道破裂:
管道中没有读端,写入数据:
写:
会产生管道破裂信号SIGPIPE,进程异常结束
4.读到0返回:
管道中没有写端:
读:
有数据时直接读出
没有数据时不会阻塞等待直接返回,读到0
2.有名管道
有名管道-->fifo -->有文件名称的管道。
文件系统中可见,可用于任意进程间的通信。
框架:
创建有名管道 -->打开有名管道 -->读写管道
-->关闭管道 -->卸载有名管道
1、创建:mkfifo
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
mode 8进制文件权限。
返回值:成功 0
失败 -1;
2、打开有名管道 open
以O_RDONLY打开时 ,管道在open处阻塞
以O_WRONLY打开时 ,管道在open处阻塞
当两端同时打开时,才解除阻塞。
3、管道的读写: 文件IO
读: read(fd-read,buff,sizeof(buff));
写: write(fd-write,buff,sizeof(buff));
4、关闭管道:
close(fd);
5、卸载管道:remove();
int remove(const char *pathname);
功能:将指定的pathname管道文件卸载,同时
从文件系统中删除。
参数: ptahtname 要卸载的有名管道
返回值:成功 0
失败 -1;