尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux 进程通信:pipe/mkfifo 管道 + signal 信号知识点总结

Linux 进程通信:pipe/mkfifo 管道 + signal 信号知识点总结 Linux进程间通信(IPC)——管道与信号知识点总结摘要梳理Linux IPC五大方式重点讲解无名管道pipe、有名管道mkfifo以及信号机制、常见信号、signal/alarm/pause接口适合嵌入式Linux开发入门复习。目录一、进程间通信的5种方式二、管道1.无名管道 pipe2.有名管道 FIFO(mkfifo)三、信号1.进程收到信号的3种处理方式2.常用信号速查表3.信号相关API一、进程间通信的5种方式管道分为无名管道、有名管道(FIFO)信号内核给应用进程发送通知事件属于异步通信消息队列内核维护消息链表按消息类型收发数据共享内存多个进程映射同一块物理内存速度最快信号灯(信号量)主要做进程/线程同步互斥不传递业务数据二、管道1.无名管道 pipe只能用于有亲缘关系进程通信父子、兄弟进程。函数原型#include unistd.h int pipe(int pipefd[2]);参数pipefd[0]管道读端文件描述符pipefd[1]管道写端文件描述符返回值成功返回0失败返回‑1功能在内核创建一块缓冲区实现单向数据流。✨无名管道核心行为特性管道存在写端管道有数据read直接读出数据管道无数据read阻塞等待直到有数据写入管道所有写端全部关闭管道还有残留数据正常读完管道无数据read返回0直接结束不阻塞管道存在读端缓冲区未满write直接写入缓冲区写满(默认64K)write阻塞等待读端取走数据管道所有读端全部关闭继续调用write写数据 → 产生SIGPIPE管道破裂信号进程直接退出。2.有名管道 FIFO(mkfifo)支持任意两个进程通信无关进程。磁盘上生成管道文件只是一个入口数据依旧存放内核缓冲区磁盘不存真实数据。函数原型#include sys/types.h #include sys/stat.h int mkfifo(const char *pathname, mode_t mode);参数pathname管道文件路径例/tmp/fifo_chatmode文件权限如0664返回值成功0失败‑1⚠️重要特性有名管道open会阻塞必须读、写两端同时打开FIFOopen调用才会返回只打开一端程序阻塞等待另一端进程打开。踩坑点多次调用mkfifo文件已存在时返回‑1需要判断errno EEXIST文件存在属于正常情况不要直接退出程序。课堂案例双进程聊天两个程序read.c、write.c双向FIFO实现聊天write.c读取终端输入发送数据给read.cread.c接收打印再读取终端输入回传给write.cwrite收到消息打印循环往复实现双向聊天。三、信号信号内核层与应用层通信的异步机制。信号是事件通知进程收到信号立刻打断当前业务逻辑去处理信号。1.进程收到信号的3种处理方式缺省SIG_DFL操作系统默认行为大部分信号默认杀死进程忽略SIG_IGN收到信号直接无视什么都不干捕捉注册自定义回调函数收到信号执行自己写的处理函数。⚠️限制SIGKILL(9)、SIGSTOP(19)不能忽略、不能捕捉只能执行系统默认行为。2.常用信号速查表信号触发来源说明SIGINTCtrl c中断进程终止程序SIGQUITCtrl \退出会生成core转储文件SIGTSTPCtrl z挂起/暂停进程SIGKILLkill -9 pid强制杀死不可捕获忽略SIGSEGV程序异常段错误内存越界访问SIGPIPE管道管道破裂读端全部关闭还写数据SIGALRMalarm函数定时闹钟时间到触发SIGCHLD子进程退出子进程结束通知父进程SIGCONT恢复运行把暂停的进程重新唤醒继续执行3.信号相关API① signal() 注册信号处理函数typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);参数signum信号编号handlerSIG_IGN忽略信号SIG_DFL恢复系统默认处理自定义函数指针捕捉信号执行回调返回值成功返回上一次注册的处理函数失败返回SIG_ERR② pause()int pause(void);功能让进程休眠阻塞直到收到信号被唤醒。③ alarm() 闹钟unsigned int alarm(unsigned int seconds);功能seconds秒之后给当前进程发送SIGALRM闹钟信号。多次调用alarm会覆盖上一次闹钟时间。
返回列表