day28 IPC通信机制
概念
本地通信
传统的通信机制
1.无名管道 pipe
2.有名管道 fifo
3.信号 signal
systemV通信机制
1.消息队列 message queue
2.共享内存 shared memory
3.信号灯集 semphore
跨主机的通信方式
套接字 socket
无名管道
本质
就是一个内核文件(文件描述符)
操作管道文件本质上就是文件的读取和写入
只可使用文件io函数:open close read write(lseek移动光标不允许使用)
特点
管道文件满足队列的特点
管道数据为一次性的
管道读写端关闭后,管道自动释放
write和read读取特殊文件时,默认是阻塞函数
管道大小
65536字节--->64K
管道是一种半双工的通信机制
单工:同时只运行A--->B,不允许B--->A
半双工:同时只允许A--->B 或者 允许B--->A
全双工:同时允许A--->B 也允许B--->A
无名管道
该管道没有名字,只可用于存在亲缘关系的进程间通信
无名管道函数
pipe
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创间无名管道
参数: int pipefd[2]:指向数组长度为2的首地址
pipefd[0]:管道读端 pipefd[1]:管写端
返回值: 成功返回0,失败返回-1,跟新errno
管道破裂
写端开启,读端关闭,不可以写,写入会发生管道破裂
无名管道
和无名管道大部分无异
区别---可用于无亲缘
该管道有名字,可以用于不存在亲缘关系的进程间通信
有名管道函数
mkfifo
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
功能:创建有名管道
参数:const char *pathname 创建有名管道的路径以及文件名
mode_t mode 权限(记得修改权限掩码umask(0);)
返回值:成功0,失败-1,更新errno
信号
概念
信号:是一种软件层上的中断模拟,是一种异步通信模式
异步:任务与任务之间没关系,按照时间片轮询机制访问
同步:任务有层级关系,先执行前置任务,才能执行后续任务
信号的处理方式
默认:当触发信号后,默认执行信号对应的处理函数
忽略:当触发信号后,会忽略信号处理函数
捕获:当触发信号后,做另一个信号处理函数
认识信号
kill -l 查看信号
1-31 标准信号,当多次发送时,内核只做一次处理
34-64 实时信号,当多次发送时,会把信号存于队列,执行上一个信号后,再执行下一个(类比vip)
硬件点出来的信号
2)SIGINT ctrl c
3)SIGQUIT ctrl \
19) SIGSTOP ctrl z
不可忽略和捕获的信号
9)SIGKILL
19)SIGSTOP
常见信号
11) SIGSEGV 段错误时
13) SIGPIPE 管道破裂
14) SIGALRM 时钟
17) SIGCHLD 子进程退出后给父进程发送该信号
信号相关函数
signal
sighandler_t signal(int signum, sighandler_t handler);
功能:信号处理函数(默认,忽略,捕获)
参数:int signum 处理的信号编号
sighandler_t handler 处理方式 函数指针
SIG_IGN 忽略
SIG_DFL 默认
函数名 捕获
返回值:成功返回之前的信号处理方式,失败返回SIG_ERR,更新errno
信号屏蔽
当正在执行信号处理函数时,又重新发送同一个信号,后面的信号会被屏蔽,不执行,此时需要其他信号终止
kill
int kill(pid_t pid, int sig);
功能:发送信号
参数:pid_t pid
pid 进程 >0 给指定的进程发送
=0 给当前进程组下所有进程发送 =-1 给主机下的所有有权限的进程发送,不含1 <-1 把信号发给|pid| 进程组 下的所有进程组
int sig 信号
返回值:成功返回0,失败返回-1,更新errno
alarm
unsigned int alarm(unsigned int seconds);
功能:发送一个时钟信号 等价于 kill(pid,14)
参数:unsigned int seconds 定的时间(秒数)
返回值:返回生一次未被触发的剩余秒数,没有则返回0
速记
函数 | 功能 | 用法 | 参数 | 返回值 |
pipe | 无名管道创建 | int pipefd[2]; pipe(pipefd); | pipefd数组 | 成0败-1,更新errno |
mkfifo | 有名管道创建 | mkfido(路径,权限) | 路径,权限 | 成0败-1,更新errno |
signal | 信号处理 | signal(信号编号,信号方式) | handler SIG_IGN 忽略 SIG_DFL 默认 函数名 捕获 | 成功返回之前的信号处理方式,失败返回SIG_ERR,更新errno |
kill | 发送信号 | kill(pid,信号) | pid_t pid 0 当前组下 >0 即pid | 成功返回0,失败返回-1,更新errno |
alarm | 定时 | alarm(秒数) | 秒数 | 返回生一次未被触发的剩余秒数,没有则返回0 |