news 2026/3/11 14:05:32

Linux 进程通信:信号与共享内存详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 进程通信:信号与共享内存详解

一、信号通信

信号是 Linux 中用于异步通信、通知机制、处理随机事件的轻量级 IPC 方式,比如进程终止、异常通知等。

1. 信号的发送与接收流程

  1. 触发信号:根据需求(如用户按下 Ctrl+C)触发信号;
  2. 内核查找进程:Linux 接收信号请求,在 PCB(进程控制块)链表中找到目标进程的 PID;
  3. 中断进程执行信号处理函数:目标进程暂停当前工作,执行 PCB 中注册的信号处理函数(如handle2);
  4. 恢复原进程执行:信号处理函数执行完毕后,原进程继续运行。

2. 常见信号及默认行为

Linux 系统定义了多个信号,每个信号有其默认处理动作(可通过man 7 signal查看)。常见信号及默认行为如下:

信号名取值动作说明
SIGHUP1Term控制终端挂起
SIGINT2Term键盘中断(Ctrl+C)
SIGQUIT3Core键盘退出(Ctrl+\),并生成 core dump
SIGILL4Core非法指令
SIGABRT6Core进程调用abort()触发
SIGKILL9Term强制终止进程(无法捕获 / 阻塞 / 忽略
SIGSEGV11Core段错误(非法内存访问)
SIGPIPE13Term向无读者的管道写数据
SIGALRM14Term定时器信号(alarm()触发)
SIGTERM15Term终止信号(默认kill命令发送)
SIGSTOP19Stop暂停进程(无法捕获 / 阻塞 / 忽略

3. 信号相关函数

(1)发送信号:kill

向指定进程发送信号:

c

运行

#include <signal.h> #include <sys/types.h> // 向pid对应的进程发送sig信号 int kill(pid_t pid, int sig);
  • 参数:
    • pid:目标进程 PID;
    • sig:要发送的信号编号(如SIGKILL对应 9);
  • 返回值:成功返回 0,失败返回 - 1。
(2)捕获 / 自定义信号处理:signal

注册信号处理函数,自定义信号的行为:

c

运行

#include <signal.h> // 注册信号处理函数 void (*signal(int signum, void (*handler)(int)))(int);
  • 参数:
    • signum:要捕获的信号编号;
    • handler:处理函数(可选值:
      • SIG_DFL:默认处理;
      • SIG_IGN:忽略信号;
      • 自定义函数:如void my_handler(int sig));
  • 返回值:成功返回原处理函数指针,失败返回SIG_ERR

二、共享内存

共享内存是 System V 提供的一种高效的进程间通信方式,通过让多个进程直接访问同一块物理内存实现数据共享(无需拷贝,速度快)。

1. 共享内存的使用步骤

共享内存的生命周期分为 5 步:

  1. 申请共享内存
  2. 映射共享内存(将内核中的共享内存映射到进程地址空间);
  3. 读写共享内存
  4. 撤销映射
  5. 删除共享内存

2. 共享内存与管道的区别

特性共享内存管道
读写权限双方均可读写半双工(一端读、一端写)
同步机制需配合信号 / 信号量等同步自带同步(无数据时读阻塞)
数据管理不删除数据,数据保持数据读取后被移除
效率极高(直接访问内存)较低(需内核拷贝)

3. 共享内存相关函数

(1)创建 / 获取共享内存:shmget

c

运行

#include <sys/ipc.h> #include <sys/shm.h> // 创建或获取共享内存 int shmget(key_t key, size_t size, int shmflg);
  • 参数:
    • key:共享内存的键值(可通过ftok生成);
    • size:共享内存大小(字节);
    • shmflg:标志位(如IPC_CREAT|0666表示创建并设置权限);
  • 返回值:成功返回共享内存 ID,失败返回 - 1。
(2)生成键值:ftok

为共享内存生成唯一键值:

c

运行

#include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
  • 参数:
    • pathname:已存在的文件路径;
    • proj_id:整形数字(通常用 ASCII 字符);
  • 返回值:成功返回键值,失败返回 - 1。
(3)映射共享内存:shmat

将共享内存映射到进程地址空间:

c

运行

#include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 参数:
    • shmid:共享内存 ID;
    • shmaddr:映射地址(NULL 表示由系统分配);
    • shmflg:标志位(如 0 表示可读可写);
  • 返回值:成功返回映射后的地址,失败返回(void*)-1
(4)撤销映射:shmdt

将共享内存从进程地址空间撤销:

c

运行

#include <sys/shm.h> int shmdt(const void *shmaddr);
  • 参数:shmaddrshmat返回的映射地址;
  • 返回值:成功返回 0,失败返回 - 1。
(5)控制共享内存:shmctl

删除共享内存或获取 / 设置其属性:

c

运行

#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 参数:
    • shmid:共享内存 ID;
    • cmd:操作命令(如IPC_RMID表示删除共享内存);
    • buf:共享内存属性结构体(可传 NULL);
  • 返回值:成功返回 0,失败返回 - 1。

4. 共享内存相关命令

  • 查看共享内存:ipcs -m
  • 删除共享内存:ipcrm -m 共享内存ID

总结

  • 信号:适合异步通知、简单事件处理,缺点是无法传递复杂数据;
  • 共享内存:适合大量数据的高效共享,需配合同步机制(如信号、信号量)使用。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 6:10:10

企业级扶贫助农系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 背景相关&#xff1a; 随着乡村振兴战略的深入推进&#xff0c;数字化技术在扶贫助农领域的应用日益广泛。传统扶贫模式存在信息不对称、资源分配不均、管理效率低下等问题&#xff0c;亟需通过信息化手段提升扶贫工作的精准性和可持续性。企业级扶贫助农系统通过整合互联…

作者头像 李华
网站建设 2026/3/8 13:15:16

信息管理毕设2026开题汇总

1 引言 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应用需求&#xff…

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

LangFlow权限控制系统设想与路线图

LangFlow权限控制系统设想与路线图 在AI应用开发日益普及的今天&#xff0c;LangChain已经成为连接大语言模型与外部系统的核心桥梁。然而&#xff0c;随着团队协作和企业级部署需求的增长&#xff0c;基于LangChain构建的可视化工具LangFlow也面临着新的挑战——如何在保持低代…

作者头像 李华
网站建设 2026/3/10 19:16:43

LangFlow医疗辅助诊断系统搭建全过程

LangFlow医疗辅助诊断系统搭建全过程 在智慧医疗的浪潮中&#xff0c;一个现实问题始终困扰着医院信息化团队&#xff1a;如何让医生真正参与到AI系统的构建中&#xff1f;传统的智能辅助诊断系统往往由工程师闭门开发&#xff0c;临床专家只能被动接受输出结果。即便模型准确率…

作者头像 李华
网站建设 2026/3/11 4:03:01

LangFlow图像生成任务整合Stable Diffusion步骤

LangFlow整合Stable Diffusion实现图像生成的完整实践 在AI应用开发日益复杂的今天&#xff0c;如何快速构建一个从自然语言输入到高质量图像输出的端到端系统&#xff0c;成为许多开发者和创意工作者关注的核心问题。传统的做法是编写大量胶水代码来串联大模型调用、提示词优化…

作者头像 李华
网站建设 2026/3/6 20:07:57

GESP认证C++编程真题解析 | B3927 [GESP202312 四级] 小杨的字典

​欢迎大家订阅我的专栏&#xff1a;算法题解&#xff1a;C与Python实现&#xff01; 本专栏旨在帮助大家从基础到进阶 &#xff0c;逐步提升编程能力&#xff0c;助力信息学竞赛备战&#xff01; 专栏特色 1.经典算法练习&#xff1a;根据信息学竞赛大纲&#xff0c;精心挑选…

作者头像 李华