C++学习之路--9
IPC:interprocess Communication 进程间通信, 通过内核提供的缓冲区进行数据交换的机制。
IPC通信的方式有几种:
- pipe管道 —最简单
- fifo有名管道
- mmap文件映射共享IO-- 速度最快
- 本地socket最稳定
- 信号 携带信息量最小
- 共享内存
- 消息队列
1、pipe管道 半双工通信
管道函数:int pipe(int pipefd[2])
- pipefd读写文件描述符,0代表读 1代表写
- 返回值 成功返回0,失败返回-1
父子间进程通信
dup(fd[1], STDOUT_FILENO);//标准输出重定向到管道写端,重定向。
读管道: - 写端全部关闭, read读到0 ,相当于读到文件末尾
- 写端没有全部关闭,有数据 – read读到数据, 没有数据—read阻塞,fcnt函数可以更改非阻塞。
写管道: - 读端全部关闭 – 产生一个信号SIGPIPE,程序异常终止
- 读端未全部关闭 管道已满—write阻塞 管道未满–write正常写入
计算管道大小 512*8 long fpathconf(int fd, int name)
ulimit a
只能有血缘关系的进程间通信。父子进程单方向通信
FIFO通信
实现无血缘关系进程通信
创建一个管道的伪文件 mkfifo
mmap共享映射区
创建映射区
void *mmap(void *addr,size_t length, int prot , int flags, int fd , off_t offset);
- addr 传NULL
- length
- prot prot_read可读 prot_write可写
- fd文件描述符,open 打开一个文件
- offset偏移量
- 返回值 成功可用内存首地址,失败map_failed
- flags map_shared 共享的 map_privated 私有的
释放映射区
int munmap(vod *adr, size_t length); - addr传mmap返回值
- length
map_ANON 匿名映射
信号
机制:进程B发送给进程A,由内核负责发送和处理-----软中断,有可能会有延迟
产生:按键产生, kill, 定时器alarm,错误
状态:产生,递达,未决
默认处理方式:忽略,执行默认动作,捕获
要素:编号,事件,名称,默认处理动作(终止,忽略,终止+产生core, 暂停,继续) man 7 signal
19和9号信号不能捕捉,忽略,和阻塞.
阻塞信号和未决信号集
kill函数
int kill(pid_t, pid ,int sig); pid > 0,要发送的进程 pid=0代表当前调用进程组内所有进程 pid=-1代表有权限发送的所有进程 pid<0代表-pid对应组内的所以进程
raise 和abort函数
raise函数给当前进程发送指定信号(自己给自己发)raise(signo) == kill(getpid(),signo);
时钟信号
alarm 定时给自己发送信号
setitimer 函数,周期性发送信号
cate和tail用法一样
信号集函数
int sigemptyset(sigset_t *set);清空信号集
int sigfillset(sigset_t *set);填充信号集
int sigadset(sigset_t *set);添加某个信号到信号集
int sigdelset(sigset_t *set);从集合中删除某个信号
int sigismember(sigset_t *set);是否为集合中成员 返回1代表在signum集合中
int sigpromack(int how, const sigset_t * set, sigset *oldset); 设置阻塞或解除阻塞信号集
how sig_block 设置阻塞 sig_unblock解除阻塞 sig_setmask设置为新的阻塞
set传入信号集
int sigpending() 获取未决信号集
信号捕捉
sighandler_t signal(int signum, sighandler_t handler); 防止进程意外死亡
int sigaction(int signum, const struct sigaction *act, strtct sigaction *oldact); 注册捕捉函数
sigchld信号处理
子进程在暂停和退出的时候会发送sigchld信号,我们可以通过捕捉sigchld信号来回收子进程。