当前位置: 首页 > news >正文

LINUX15--进程间的通信-信号量

12.3信号量

在Linux中级开发中,信号量是进程间通信(IPC)的重要同步机制。下面我将详细总结信号量的核心知识点,帮助你全面掌握这一关键技术。

12.3.1信号量基本概念

信号量的本质

信号量是一种特殊的计数器,主要用于实现进程间的互斥与同步。它本身不用于传输数据,而是作为保护机制来控制对共享资源的访问。

核心特性

  • 原子操作:P操作和V操作是原子性的,执行期间不会被中断
  • 资源计数:信号量的值表示当前可用资源的数量
  • 进程阻塞:当资源不足时,进程会被挂起等待

12.3.2 信号量工作原理

PV操作原语:

信号量的核心是两种原子操作:

P操作(等待/申请资源)

  • 将信号量值减1
  • 如果信号量值 ≥ 0,进程继续执行
  • 如果信号量值 < 0,进程被阻塞,放入等待队列

V操作(发送/释放资源)

  • 将信号量值加1
  • 如果有进程在该信号量上等待,则唤醒一个进程
  • 如果没有进程等待,信号量值保持正值

信号量值的含义

  • 值 > 0:表示可用资源的数量
  • 值 = 0:表示无可用资源,但无进程等待
  • 值 < 0:其绝对值表示等待该资源的进程数量

12.3.3 信号量系统调用

1. semget - 创建/获取信号量

#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);

参数说明

  •  key :信号量键值,可以使用 ftok() 生成或使用 IPC_PRIVAT  E 
  •  nsems :需要创建的信号量数量
  •  semflg :权限标志,如 IPC_CREAT   | 0666 

2. semop - 信号量操作

int semop(int semid, struct sembuf *sops, unsigned nsops);

sembuf结构体

struct sembuf {short sem_num; // 信号量编号short sem_op; // 操作类型:-1(P操作), 1(V操作)short sem_flg; // 标志位,如SEM_UNDO};

3. semctl - 信号量控制

int semctl(int semid, int semnum, int cmd, ...);

常用命令

  •  SETVAL :设置信号量的值
  •  GETVAL :获取信号量的值
  •  IPC_RMID :删除信号量集

12.3.4 信号量的三种应用场景

1. 进程互斥(Mutex)

保证同一时刻只有一个进程可以访问临界资源。

实现步骤

// 初始化信号量为1sem_t mutex = 1;// 进程进入临界区前P(mutex);// 临界区代码V(mutex);

2. 进程同步

控制进程的执行顺序,保证"一前一后"执行。

实现步骤

// 初始化信号量为0sem_t sync = 0;// 前驱进程// 执行代码...V(sync); // 发送信号// 后继进程P(sync); // 等待信号// 执行代码...

3. 前驱关系

实现复杂的进程执行顺序控制。

12.3.5 实际代码示例

互斥信号量示例

#include <sys/sem.h>#include <stdio.h>// 定义联合体(某些Linux版本需要)union semun {int val;struct semid_ds *buf;unsigned short *array;};int main() {int semid;key_t key = 1234;// 创建信号量semid = semget(key, 1, IPC_CREAT | 0666);// 初始化信号量为1(互斥信号量)union semun arg;arg.val = 1;semctl(semid, 0, SETVAL, arg);// P操作struct sembuf p = {0, -1, SEM_UNDO};semop(semid, &p, 1);// 临界区代码printf("进程进入临界区\n");// V操作struct sembuf v = {0, 1, SEM_UNDO};semop(semid, &v, 1);return 0;}

使用注意事项

1. 信号量初始化:信号量创建后必须正确初始化,否则其值是不确定的。

2. SEM_UNDO标志:使用 SEM_UNDO 标志可以确保进程异常终止时,信号量值能够恢复,避免资源死锁。

3. 错误处理:所有信号量操作都应该检查返回值,确保程序的健壮性。

4. 资源清理:使用完毕后要及时删除信号量,防止资源泄漏。

12.3.6 信号量在系统中的应用

信号量在实际系统中有着广泛的应用:

  1. 打印机管理:确保多个进程不会同时使用打印机
  1. 共享内存保护:保护多个进程对同一块共享内存的访问
  1. 文件操作同步:保证对文件的互斥访问
  1. 生产者-消费者问题:协调生产者和消费者的速度

12.3.7总结

信号量是进程间通信中最重要的同步机制,具有以下核心特点:

  1. 核心功能:实现进程间的互斥与同步,保护临界资源
  1. 原子操作:P/V操作是不可分割的原子操作
  1. 灵活应用:通过不同的初始值实现互斥、同步等不同功能
  1. 系统级支持:属于System V IPC机制,由内核保证其正确性

掌握信号量的使用对于开发复杂的多进程应用程序至关重要,特别是在需要精确控制进程执行顺序和保护共享资源的场景中。

http://www.dtcms.com/a/507345.html

相关文章:

  • 在 Linux 内核中加载驱动程序(一)
  • yarn面试题
  • Android跨进程通信: Binder 进程间通信机制解析
  • 【Day 80】Linux-虚拟化
  • 建设厅官方网站网站主题的分类
  • 广州营销网站建设公司php网站开发实例项目
  • Kubernetes 核心概念解析与集群部署实战(基于 Docker+Flannel)
  • 【课堂笔记】复变函数-6
  • OpenBMC: BmcWeb处理WebScoket1 判断是否为WebSocket
  • 操作系统学习 进程(1)进程的概念与状态
  • Genie Envisioner--智元机器人--世界模型框架--2025.8.7
  • 权威网站有哪些wordpress分类目录浏览权限
  • Vue 缓存之坑,变量赋值方式和响应式数据
  • AWS CloudFormation —— 自动化部署的“云中脚本大师”
  • 响应式网站下载长沙排名推广
  • 【软考备考】 安全协议:SSL/TLS, IPSec 详解
  • 在 HarmonyOS 中平滑切换“点状粒子”与“图片粒子”(含可运行 ArkTS 示例)
  • 海门市规划建设局网站会考网页制作视频教程全集
  • 4-ARM-PEG-Pyrene(2)/Biotin(2),多功能化聚乙二醇修饰荧光标记生物分子的设计与应用探索
  • 做三折页宣传册 网站昆明网上房地产官网
  • redis-7.4.6部署安装
  • CSS学习笔记(五):CSS媒体查询入门指南
  • Redis多线程架构深度解析-从单线程到I/O Threading
  • 掌握 iOS 26 App 性能监控,多工具组合流程与实战指南
  • Spring定时任务中数据未持久化的深度排查指南:从autoCommit到事务管理的终极解法
  • BAT 大厂 java高频面试题汇总:JVM+Spring+ 分布式 +tomcat+MyBatis
  • 宸建设计网站想注册一个做网站的公司好
  • ThingsBoard开源物联网平台实践:从环境搭建到数据可视化
  • 第二章 线性表——课后习题解练【数据结构(c语言版 第2版)】
  • 成都网站建设开发公选择好的软件开发培训班