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

使用信号量实现父子父子进程交替运行的学习笔记

使用信号量实现父子父子进程交替运行的学习笔记

在学习进程同步机制时,信号量是一个非常重要的概念。相比于之前使用信号和全局变量实现进程同步的方式,信号量提供了更可靠、更灵活的同步机制。本文记录我使用 System V 信号量实现父子进程交替运行的学习过程。

程序功能说明

这个程序创建一个子进程,通过两个信号量分别控制父进程和子进程的执行权限,实现父子进程交替打印信息,各执行 10 次后程序结束。

完整代码实现

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>#include <sys/ipc.h>
#include <sys/sem.h>// 信号量增加操作
void sem_add(int sem_id, int num) {struct sembuf buff;buff.sem_flg = SEM_UNDO;  // 进程退出时自动撤销操作buff.sem_num = num;       // 信号量编号buff.sem_op = 1;          // 操作:增加1semop(sem_id, &buff, 1);
}// 信号量减少操作
void sem_sub(int sem_id, int num) {struct sembuf buff;buff.sem_flg = SEM_UNDO;  // 进程退出时自动撤销操作buff.sem_num = num;       // 信号量编号buff.sem_op = -1;         // 操作:减少1semop(sem_id, &buff, 1);
}int main() {// 创建信号量键值key_t sem_key = ftok(__FILE__, 0);if (sem_key == -1) {perror("ftok failed");return 1;}printf("创建的键的值为:0x%08x \n", sem_key);// 创建包含2个信号量的集合int sem_id = semget(sem_key, 2, 0666 | IPC_CREAT);if (sem_id == -1) {perror("sem_get failed");return 1;}printf("创建的信号量的id=%d\n", sem_id);// 初始化信号量:父进程信号量初始值为1(可以运行)semctl(sem_id, 0, SETVAL, 1);// 初始化信号量:子进程信号量初始值为0(等待状态)semctl(sem_id, 1, SETVAL, 0);// 创建子进程pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;} // 父进程逻辑else if (pid > 0) {for (int i = 0; i < 10; i++) {sem_sub(sem_id, 0);  // 获取父进程运行权限(P操作)printf("父进程在运行\n");sleep(1);sem_add(sem_id, 1);  // 释放子进程运行权限(V操作)}wait(NULL);  // 等待子进程结束semctl(sem_id, 0, IPC_RMID);  // 删除信号量集合} // 子进程逻辑else if (pid == 0) {for (int i = 0; i < 10; i++) {sem_sub(sem_id, 1);  // 获取子进程运行权限(P操作)printf("子进程在运行\n");sleep(1);sem_add(sem_id, 0);  // 释放父进程运行权限(V操作)}}return 0;
}

代码解析

核心概念与函数

  1. 信号量(Semaphore):是一种用于实现进程间同步的机制,本质上是一个计数器,用于控制对共享资源的访问。
  2. System V 信号量函数
    • ftok():生成一个唯一的键值,用于标识信号量集合
    • semget():创建或获取信号量集合
    • semctl():对信号量进行控制操作(初始化、删除等)
    • semop():执行信号量的 P/V 操作
  3. P 操作与 V 操作
    • P 操作(sem_sub):信号量值减 1,如果结果小于 0,则进程阻塞等待
    • V 操作(sem_add):信号量值加 1,如果有进程等待,则唤醒其中一个

程序工作流程

  1. 信号量初始化
    • 创建包含 2 个信号量的集合
    • 信号量 0(父进程用)初始值设为 1(允许运行)
    • 信号量 1(子进程用)初始值设为 0(阻塞等待)
  2. 父进程执行逻辑
    • 每次循环先执行 P 操作获取信号量 0
    • 打印信息并休眠 1 秒
    • 执行 V 操作释放信号量 1,允许子进程运行
    • 重复 10 次后,等待子进程结束并删除信号量集合
  3. 子进程执行逻辑
    • 每次循环先执行 P 操作获取信号量 1
    • 打印信息并休眠 1 秒
    • 执行 V 操作释放信号量 0,允许父进程运行
    • 重复 10 次后退出

学习心得

  1. 信号量 vs 信号:相比于之前用信号实现的进程同步,信号量更加可靠。信号可能会丢失,而信号量的 P/V 操作是原子的,不会出现 race condition(竞态条件)。
  2. SEM_UNDO 标志:这个标志非常有用,它确保当进程异常退出时,系统会自动撤销该进程对信号量的操作,避免其他进程因信号量值不正确而永久阻塞。
  3. 信号量集合:System V 信号量是以集合形式存在的,一个集合中可以包含多个信号量,这对于需要多个同步点的场景非常方便。
  4. 资源清理:使用完信号量后一定要记得用semctl(sem_id, 0, IPC_RMID)删除,否则信号量会一直存在于系统中,可能导致资源泄露。
  5. 权限设置:创建信号量时的权限位(0666)需要合理设置,确保相关进程有足够的操作权限。

可能的改进方向

  1. 增加更多错误处理,特别是semop()semctl()的返回值检查
  2. 可以尝试实现多个子进程之间的同步
  3. 可以使用命名信号量(POSIX 信号量)来实现同样的功能,对比两种信号量的差异
  4. 可以添加共享内存,实现进程间的数据交换,结合信号量实现更复杂的同步逻辑

通过这个实例,我对信号量的工作原理和使用方法有了更清晰的认识。信号量作为一种经典的进程同步机制,在多进程编程中有着广泛的应用,掌握它对于编写健壮的并发程序非常重要。

http://www.rkmt.cn/news/55111.html

相关文章:

  • 2025 最新基质生产线厂家权威推荐榜:泥炭育苗栽培专用设备,全球测评优质厂家全解析花卉/营养土/椰糠/白泥炭/黑泥炭/齿轮筛基质生产线公司推荐
  • 朝阳市一对一辅导机构推荐,2026年课外家教补习机构权威排行榜
  • 蚌埠一对一辅导机构权威推荐:2025家教机构排行榜,穿透式测评!
  • 锦州一对一家教机构推荐:2025年辅导机构权威排行榜,5家机构避坑指南
  • 黄南州一对一补习机构良心推荐:2026最新家教机构榜单!费用透明不花冤枉钱
  • 长沙一对一课外辅导机构推荐:2025权威榜单来了,精准提分不踩坑
  • 这所双非高校在AAAI 2026上发表11篇论文
  • 大连一对一辅导机构推荐,2025年课外家教补习机构权威排行榜
  • 联系我 —— 联系方式
  • 农业机器人仿真面临的挑战有哪些?
  • 2025 最新轮毂改装厂家推荐!国际认证 + 权威测评双重背书,高性价比轮毂改装源头厂家实力榜单
  • 2025 年 11 月短视频运营服务团队权威推荐榜:专业短视频拍摄运营,制作运营,矩阵运营,账号运营,代运营及运营拓客公司优选
  • 2025 年 11 月塑胶容器厂家推荐排行榜,塑料容器,透明塑胶容器,吹塑容器,医药容器瓶源头优质厂商精选
  • 2025 年 11 月流速仪厂家推荐排行榜,LS300-A 流速仪,旋杯式/旋桨式流速仪,手持式电波雷达流速仪公司精选
  • 山西忻州一对一辅导机构口碑之选:2025年备受好评的补习机构
  • 2025年11月国内候车亭/公交站牌厂家权威推荐TOP10
  • 【完整源码+数据集+部署教程】【零售和消费品&存货】超市购物车商品检测系统源码&素材集全套:改进yolo11-DySnakeConv
  • 2025 最新工业开关厂家推荐排行榜:电感式 / 电容式 / 光电开关等优质国产企业权威甄选环形接近开关/磁感应式接近开关/限位开关/红外开关/接近开关/磁性开关/光电开关公司推荐
  • AI无人机助力生态智慧农田倒伏检测与防控,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型创建构建无人机航拍智慧生态农田场景下稻田作物倒伏智能化检测预警系统
  • 2025年酸化水生成器优质厂家权威推荐榜单:酸水设备/酸化水机器/酸化水设备企业精选
  • P19_神经网络-非线性激活
  • 解码标杆营销逻辑,纷享管理服务实战课圆满落幕
  • 2025年11月网架/钢结构/光伏支架钢管厂家TOP10:江苏华力钢管登顶
  • 2025 年 11 月宣传片拍摄团队最新推荐榜:北京通州宣传片拍摄、宣传片剪辑、宣传片制作、产品宣传片、企业宣传片拍摄团队推荐
  • 2025年11月烘干房工厂推荐榜单
  • docker运行 paddlevlm
  • 完整教程:Centos7 oracle 11G 搭建ADG
  • opentelemetry全链路初探--日志跳转trace
  • 2025 年粘接与复材技术服务优选:上海逸发粘接化工科技有限公司 —— 国际标准落地 + 全产业链赋能,助力制造业合规升级
  • 隐私计算新突破:同态加密与联邦学习的融合