ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux 进程间通信学习笔记

Linux 进程间通信学习笔记 一、进程间通信 5 种方式管道无名管道、有名管道 FIFO信号消息队列共享内存信号灯信号量进程之间互相隔离各自有独立地址空间不能直接访问对方内存必须依靠内核提供的机制完成数据交互。1. 管道1.1 无名管道 pipe限制只支持有亲缘关系的进程通信父子、兄弟进程函数原型intpipe(intpipefd[2]);参数pipefd[0]读端文件描述符pipefd[1]写端文件描述符返回值成功返回 0失败返回 -1无名管道核心特性考试重点管道有写端管道里面有数据直接读取数据管道无数据读操作阻塞等待直到有数据写入管道没有写端写端全部关闭管道有数据直接读没有数据read 直接返回 0不阻塞管道有读端管道没写满默认 64K 缓冲区直接写入管道写满write 阻塞等待读端读走数据之后才能继续写管道没有读端所有读端关闭执行 write 写数据触发管道破裂 SIGPIPE 信号进程直接退出。无名管道是半双工一端读、一端写单向数据流。1.2 有名管道 FIFO mkfifo突破无名管道限制任意两个进程之间都可以通信不需要亲缘关系特性读写两端必须都打开程序才会往下执行只打开一端程序阻塞等待另一端打开。函数接口intmkfifo(constchar*pathname,mode_tmode);pathname管道文件路径名mode文件权限返回值成功 0失败 -1练习写 read.c 和 write.c实现两个程序聊天。write.c 接收终端输入发给 read.cread.c 接收打印再把内容回传给 write.c。2. 信号信号是内核层给应用层进程发送通知的机制属于异步通信。进程不知道信号什么时候到来。进程收到信号三种处理方式缺省 SIG_DFL系统默认行为大部分信号默认杀死进程忽略 SIG_IGN收到信号直接无视什么都不干捕捉注册自定义处理函数信号来了执行自己写的回调函数常用信号记忆表格信号触发来源作用SIGINTCtrl c中断进程SIGQUITCtrl \退出进程SIGKILL(9)kill -9强制杀死不能忽略、不能捕捉SIGSEGV程序内部段错误SIGPIPE管道写操作管道破裂SIGALRMalarm()定时时间到达SIGCHLD子进程子进程结束通知父进程SIGCONT唤醒继续运行暂停进程SIGSTOP(19)暂停进程不能忽略、不能捕捉SIGTSTPCtrl z挂起暂停SIGIO异步 IO 通知重点9 号 SIGKILL、19 号 SIGSTOP不能忽略、不能捕捉无法被程序拦截。信号函数接口signal() 注册信号处理函数typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);signum信号编号handlerSIG_IGN忽略信号SIG_DFL恢复系统默认处理自定义函数地址捕捉信号信号到来调用该函数返回值成功返回上一次注册的处理函数地址失败返回SIG_ERRpause()intpause(void);功能让进程休眠阻塞直到收到信号才唤醒。alarm() 闹钟unsignedintalarm(unsignedintseconds);seconds 秒之后内核给当前进程发送SIGALRM闹钟信号。 学习复盘 踩坑总结无名管道只能亲缘进程有名管道 FIFO 任意进程都能用。管道破裂写管道但是所有读端全部关闭 → SIGPIPE 信号进程直接死掉。写代码必须注意。信号是异步进程不知道信号什么时候来。9、19 号信号不受程序控制。pipe 创建出来两个 fdfork 之后子进程会复制文件描述符父子各持有读写两端记得不用的一端 close 关闭。pause 会一直睡只有信号到来才会解除阻塞。
返回列表