news 2026/2/28 3:46:36

学习笔记——Linux进程间通信(IPC)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习笔记——Linux进程间通信(IPC)

Linux进程间通信(IPC)

一、信号通信

1. 信号概述

  • 应用场景

    • 异步通信

    • 通知机制

    • 处理随机事件

  • 特点:轻量级,用于进程间简单通知

2. 信号处理流程

  1. 信号产生:根据需要(随机事件)产生信号

  2. 内核处理:Linux内核接收到信号请求,在PCB链表中查找对应的PID

  3. 信号处理:找到对应进程后,暂停当前工作流程,执行PCB中信号处理函数

    • 例:发送信号2,则调用handle2()

  4. 恢复执行:信号处理函数执行完毕后,进程继续原来的代码执行

3. 信号相关函数

发送信号
int kill(pid_t pid, int sig);
  • 功能:给指定进程发送信号

  • 参数

    • pid:接收信号的进程PID

    • sig:信号编号(可用kill -l查看)

  • 返回值:成功返回0,失败返回-1

信号捕获与处理
void (*signal(int signum, void (*handler)(int)))(int); // 或使用简化类型 sighandler_t signal(int signum, sighandler_t handler);
  • handler参数选项

    • SIG_DFL:默认处理

    • SIG_IGN:忽略信号

    • 自定义函数:用户自定义处理函数

查看信号信息
man 7 signal # 查看系统中信号的说明和默认处理行为

二、管道通信

1. 无名管道

int pipe(int pipefd[2]);
  • 功能:创建并打开一个无名管道

  • 参数

    • pipefd[0]:固定读端

    • pipefd[1]:固定写端

  • 特点

    • 只能用于有亲缘关系的进程间通信

    • 单向通信

    • 生命周期随进程结束

2. 有名管道

int mkfifo(const char *pathname, mode_t mode);
  • 功能:创建有名管道文件

  • 参数

    • pathname:管道文件路径+名称

    • mode:八进制文件权限

  • 特点

    • 可用于任意进程间通信

    • 以文件形式存在于文件系统

    • 需要手动删除

三、共享内存

1. 概述

  • 提供者:System V(Unix操作系统)

  • 特点

    • 最高效的IPC方式

    • 进程直接读写内存,无需内核介入

    • 需要配合其他同步机制(如信号、信号量集)

2. 与管道对比

特性共享内存管道
读写方向双方都可读写单向
读阻塞
写阻塞
数据存储内存数组内核缓冲区
数据保持不删除数据读取后删除

3. 使用步骤

生成key → 申请对象 → 映射对象 → 读写对象 → 撤销映射 → 删除对象

4. 相关函数

生成唯一键值
key_t ftok(const char *pathname, int proj_id);
  • 功能:生成唯一临时键值

  • 参数

    • pathname:任意存在的文件路径

    • proj_id:整形数字(通常用ASCII字符)

  • 注意:路径文件不能被删除重建

申请共享内存
int shmget(key_t key, size_t size, int shmflg);
  • 功能:向内核申请共享内存

  • 参数

    • key:唯一键值

    • size:共享内存大小

    • shmflg:访问权限(八进制)+ 标志

      • IPC_CREAT:第一个申请时使用

      • IPC_EXCL:检测是否存在

  • 返回值:成功返回共享内存ID(shmid)

映射共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 功能:将共享内存映射到本地内存空间

  • 参数

    • shmid:共享内存ID

    • shmaddr:本地地址(通常为NULL,系统自动分配)

    • shmflg

      • 0:可读写

      • SHM_RDONLY:只读

  • 返回值:成功返回映射地址

读写操作
memcpy(); // 二进制数据 strcpy(); // 字符串数据
撤销映射
int shmdt(const void *shmaddr);
  • 功能:断开本地内存与共享内存的映射

  • 参数shmaddr- 映射地址

删除共享内存对象
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 功能:修改属性或删除共享内存

  • 参数

    • shmid:共享内存ID

    • cmdIPC_RMID(删除)

    • buf:NULL(只删除对象)

5. 系统命令

ipcs -a # 查询所有IPC对象(共享内存、信号量集、消息队列) ipcrm -m ID # 删除指定的共享内存

四、使用注意事项

  1. 信号

    • 信号处理函数应尽量简短

    • 注意信号的可重入性问题

    • 某些信号不可捕获(如SIGKILL)

  2. 管道

    • 无名管道需在fork前创建

    • 有名管道需要处理读写阻塞

    • 注意管道缓冲区大小限制

  3. 共享内存

    • 必须配合同步机制使用

    • 注意内存映射的生命周期

    • 及时清理,避免内存泄漏

    • 注意多进程并发访问的数据一致性问题

  4. 通用建议

    • 错误处理要完善

    • 资源使用后及时释放

    • 考虑进程异常退出的清理工作

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 18:34:06

Langchain-Chatchat辅助竞品分析报告撰写

Langchain-Chatchat辅助竞品分析报告撰写 在企业战略决策的日常中,分析师常常面对这样的困境:几十份PDF格式的竞品白皮书、财报摘要和行业研报堆满桌面,信息分散、重复交叉,关键数据往往藏在某页不起眼的角落。手动翻阅不仅效率低…

作者头像 李华
网站建设 2026/2/9 13:00:33

Kotaemon音频转录内容检索可行性验证

Kotaemon音频转录内容检索可行性验证在远程办公、在线教育和智能客服日益普及的今天,每天产生的会议录音、课程讲解和通话记录正以惊人的速度积累。面对动辄数小时的音频资料,人们依然依赖“快进重听”的原始方式查找信息——这不仅效率低下,…

作者头像 李华
网站建设 2026/2/28 1:40:47

FaceFusion人脸融合在虚拟酒店接待员中的服务创新

FaceFusion人脸融合在虚拟酒店接待员中的服务创新 在高端酒店大堂,一位刚下长途航班的旅客略显疲惫地走向自助服务终端。屏幕亮起,迎接他的不是冷冰冰的机械界面,而是一位面带温和微笑、外貌特征与他同属亚洲裔的中年女性虚拟接待员。她语气温…

作者头像 李华
网站建设 2026/2/26 14:05:09

Langchain-Chatchat在影视剧本创作中的灵感激发

Langchain-Chatchat在影视剧本创作中的灵感激发 在一部影视作品的诞生过程中,从最初的角色设定到最终成片的情节闭环,编剧往往要面对数以百计的文档、草稿和会议纪要。当一个角色三年前在某场戏中轻描淡写的一句话,突然成为解开反派动机的关键…

作者头像 李华
网站建设 2026/2/27 23:28:34

拓扑BICs远场偏振矢量图拓扑荷的计算与COMSOL光子晶体超表面计算

拓扑BICs远场偏振矢量图拓扑荷的计算 COMSOL光子晶体超表面计算在光学领域,拓扑BICs(拓扑束缚态在连续谱中)相关研究正逐渐崭露头角,而对其远场偏振矢量图拓扑荷的计算则是关键环节。同时,借助COMSOL进行光子晶体超表面…

作者头像 李华
网站建设 2026/2/22 22:57:15

为什么Langchain-Chatchat成为开源知识库问答的标杆?

为什么 Langchain-Chatchat 成为开源知识库问答的标杆? 在企业越来越依赖数据驱动决策的今天,一个现实问题摆在面前:内部积累了海量文档——员工手册、产品说明、技术规范、客户合同,却没人能快速找到关键信息。HR 被重复询问年假…

作者头像 李华