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信号来回收子进程。

猜你喜欢

转载自blog.csdn.net/weixin_43615373/article/details/90898619