Linux 进程间通信学习笔记

一、进程间通信 5 种方式

  1. 管道(无名管道、有名管道 FIFO)
  2. 信号
  3. 消息队列
  4. 共享内存
  5. 信号灯(信号量)

进程之间互相隔离,各自有独立地址空间,不能直接访问对方内存,必须依靠内核提供的机制完成数据交互。

1. 管道

1.1 无名管道 pipe

  • 限制:只支持有亲缘关系的进程通信(父子、兄弟进程)
  • 函数原型
c 复制代码
int pipe(int pipefd[2]);
  • 参数
    • pipefd[0]:读端文件描述符
    • pipefd[1]:写端文件描述符
  • 返回值:成功返回 0,失败返回 -1
无名管道核心特性(考试重点)
  1. 管道有写端
    • 管道里面有数据,直接读取数据
    • 管道无数据,读操作阻塞等待,直到有数据写入
  2. 管道没有写端(写端全部关闭)
    • 管道有数据直接读;没有数据,read 直接返回 0,不阻塞
  3. 管道有读端
    • 管道没写满(默认 64K 缓冲区),直接写入
    • 管道写满,write 阻塞,等待读端读走数据之后才能继续写
  4. 管道没有读端(所有读端关闭)
    • 执行 write 写数据,触发管道破裂 SIGPIPE 信号,进程直接退出。

无名管道是半双工:一端读、一端写,单向数据流。

1.2 有名管道 FIFO mkfifo

  • 突破无名管道限制:任意两个进程之间都可以通信,不需要亲缘关系
  • 特性:读写两端必须都打开,程序才会往下执行;只打开一端,程序阻塞等待另一端打开。

函数接口

c 复制代码
int mkfifo(const char *pathname, mode_t mode);
  • pathname:管道文件路径名
  • mode:文件权限
  • 返回值:成功 0,失败 -1

练习:写 read.c 和 write.c,实现两个程序聊天。

write.c 接收终端输入发给 read.c;read.c 接收打印,再把内容回传给 write.c。

2. 信号

信号是内核层给应用层进程发送通知的机制,属于异步通信。进程不知道信号什么时候到来。

进程收到信号三种处理方式

  1. 缺省 SIG_DFL:系统默认行为(大部分信号默认杀死进程)
  2. 忽略 SIG_IGN:收到信号直接无视,什么都不干
  3. 捕捉:注册自定义处理函数,信号来了执行自己写的回调函数

常用信号记忆表格

信号 触发来源 作用
SIGINT Ctrl + c 中断进程
SIGQUIT Ctrl + \ 退出进程
SIGKILL(9) kill -9 强制杀死,不能忽略、不能捕捉
SIGSEGV 程序内部 段错误
SIGPIPE 管道写操作 管道破裂
SIGALRM alarm() 定时时间到达
SIGCHLD 子进程 子进程结束通知父进程
SIGCONT 唤醒继续运行暂停进程
SIGSTOP(19) 暂停进程,不能忽略、不能捕捉
SIGTSTP Ctrl + z 挂起暂停
SIGIO 异步 IO 通知

重点:9 号 SIGKILL、19 号 SIGSTOP,不能忽略、不能捕捉,无法被程序拦截。

信号函数接口

signal() 注册信号处理函数
c 复制代码
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • signum:信号编号
  • handler:
    • SIG_IGN:忽略信号
    • SIG_DFL:恢复系统默认处理
    • 自定义函数地址:捕捉信号,信号到来调用该函数
  • 返回值:成功返回上一次注册的处理函数地址;失败返回 SIG_ERR
pause()
c 复制代码
int pause(void);

功能:让进程休眠阻塞,直到收到信号才唤醒。

alarm() 闹钟
c 复制代码
unsigned int alarm(unsigned int seconds);

seconds 秒之后,内核给当前进程发送 SIGALRM 闹钟信号。

📝 学习复盘 & 踩坑总结

  1. 无名管道只能亲缘进程;有名管道 FIFO 任意进程都能用。
  2. 管道破裂:写管道,但是所有读端全部关闭 → SIGPIPE 信号,进程直接死掉。写代码必须注意。
  3. 信号是异步!进程不知道信号什么时候来。9、19 号信号不受程序控制。
  4. pipe 创建出来两个 fd,fork 之后子进程会复制文件描述符,父子各持有读写两端,记得不用的一端 close 关闭。
  5. pause 会一直睡,只有信号到来才会解除阻塞。
相关推荐
天启HTTP8 分钟前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
qq_284274052 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
广州浮点FLOATLIC2 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
qq_284274053 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
BLUcoding3 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK3 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2083 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)3 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6253 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
Titan20244 小时前
MySQL访问个人学习笔记
笔记·学习·mysql