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

news/2025/11/20 12:05:30/文章来源:https://www.cnblogs.com/WeiZhouWork/p/19246584

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

在学习进程同步机制时,信号量是一个非常重要的概念。相比于之前使用信号和全局变量实现进程同步的方式,信号量提供了更可靠、更灵活的同步机制。本文记录我使用 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.mzph.cn/news/970925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB实现图像缺陷检测、清晰度评估及自动对焦功能

一、系统架构设计二、核心算法 1. 图像预处理 function preprocessed = preprocess(img)% 灰度化(心理学灰度公式)grayImg = rgb2gray(img);% 自适应去噪(非局部均值滤波)denoised = nlfilter(grayImg, [5 5], @(x…

托福提分认准这些!2025五大靠谱机构推荐,从基础到冲刺全覆盖

托福提分认准这些!2025五大靠谱机构推荐,从基础到冲刺全覆盖随着留学热潮的持续升温,托福成绩作为海外院校申请的核心指标,其重要性愈发凸显。优质的托福培训不仅能帮助学员高效掌握考试技巧,更能系统性提升语言能…

海南州一对一辅导机构靠谱推荐:2026最新教育机构榜! 持证师资精准发力

孩子成绩卡在中游难突破,报大班补习像“陪读”没效果,找一对一又怕遇到师资参差不齐、退费难的糟心事?在海南州,不管是共和县、贵德县、贵南县、同德县、兴海县,还是玛沁县、班玛县、甘德县、达日县、久治县、玛多…

2025 最新切割工程队推荐!混凝土 / 桥梁 / 支撑梁 / 无损切割等全场景工程队口碑排行榜,专业服务权威推荐

引言 在建筑改造与拆除领域,切割施工的安全性、精准度与环保性直接决定工程品质。当前行业存在技术水平不均、设备迭代滞后、安全管理缺失等痛点,导致需求方难以精准筛选靠谱服务团队。本次榜单由国际建筑切割技术协…

2025年淮南一对一家教机构推荐:五大辅导机构测评排行榜,综合实力全解析!

淮南不少家长为孩子课外补习犯愁:小学想打牢基础、初中要应对衔接、高中需重点培优,都希望找到靠谱的一对一辅导或家教,可挑选教育机构、筛选培训服务方的过程满是困扰。部分教育机构的师资信息遮遮掩掩,号称“资深…

2025 最新基质生产线厂家权威推荐榜:泥炭育苗栽培专用设备,全球测评优质厂家全解析花卉/营养土/椰糠/白泥炭/黑泥炭/齿轮筛基质生产线公司推荐

引言 在全球绿色农业革命浪潮下,基质生产线作为现代农业规模化种植的核心装备,其技术先进性、环保合规性与产能适配性直接决定种植效益与生态可持续性。当前行业存在自动化水平不均、配料精度差异大、环保标准执行不…

2025 最新解压机厂家权威推荐榜:椰糠 / 泥炭 / 基质解压机源头厂家测评优选,聚焦专业服务与市场口碑

引言 在全球绿色农业可持续发展浪潮下,基质原料处理设备的技术升级成为行业核心诉求,解压机作为关键生产装备,其性能直接决定产能效率、产品合格率与环保合规水平。据国际农业装备技术协会最新测评数据显示,当前全…

从源码编译安装gdal3.6.2库

安装GDAL (Geospatial Data Abstraction Library) 是处理地理空间数据的重要步骤,其功能强大,广泛应用于GIS软件开发和地理数据处理领域。以下是编译安装GDAL 3.6.2版本的详细指南,步骤简明扼要,为了保证安装过程的…

2025 最新包装盒厂家推荐排行榜:一站式定制解决方案权威测评,涵盖食品、美妆、礼品等多领域优质品牌彩盒印刷/茶叶礼盒/烘焙包装盒订制公司推荐

引言 在消费升级与环保理念深化的双重驱动下,包装盒已成为品牌价值传递与产品竞争力提升的核心载体。然而,行业普遍存在的工艺精度不足、定制响应滞后、环保标准不达标等问题,给采购决策带来诸多挑战。本次排行榜基…

朝阳市一对一辅导机构推荐,2026年课外家教补习机构权威排行榜

“朝阳各区县一对一辅导机构哪家好?小学语数英、初中理化、高中全科补习该选谁?课时费多少钱才划算?有没有靠谱的机构推荐?”这些问题,是双塔区、龙城区、朝阳县、建平县、凌源市、北票市、喀左县7区县家长的共同…

完整教程:ctf.show--web入门--爆破

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 最新工程造价公司咨询推荐榜:国际权威测评认证的全行业靠谱服务商优选指南上海/工程造价审核/工程造价全过程跟踪审计/工程预算造价/厂房工程造价审核/工程结算造价审核公司推荐

引言 在工程建设行业迈向精细化发展的进程中,工程造价咨询的专业度直接决定项目投资回报率与建设合规性,成为行业核心竞争力之一。然而当前市场服务水平参差不齐,部分机构存在专业覆盖不全、核算精准度不足、服务链…

element-plus表格相同行合并工具

用例 <el-table :span-method="objectSpanMethod"/>const objectSpanMethod = initobjectSpanMethod([0,1,5,6]) getList(){ // ...加载数据 initSpanArr(dataList.value,serialNumber);//基准行 }代码…

蚌埠一对一辅导机构权威推荐:2025家教机构排行榜,穿透式测评!

蚌埠小学、初中、高中家长在孩子课外补习中,面临比 “辅导不对路” 更棘手的问题:小学家长选一对一家教筑牢根基,却常因家教时间调整、理念不合被迫更换,新师磨合导致补习断层;初中家长选教育机构提升效率,即便机…

html-webpack-plugin与PWA:生成Service Worker兼容HTML - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

锦州一对一家教机构推荐:2025年辅导机构权威排行榜,5家机构避坑指南

“古塔区补数学选哪家?凌河区初中英语补习多少钱?义县、凌海、北镇的孩子能上优质一对一吗?小学打基础、初中冲中考、高中备高考,不同学段学科该怎么选机构?”这是近期锦州各区县家长咨询最多的问题。家住太和区的…

黄南州一对一补习机构良心推荐:2026最新家教机构榜单!费用透明不花冤枉钱

孩子成绩卡在中游难突破,想找黄南州一对一辅导机构,却被 “师资掺水”“提分虚假”“退费艰难” 的问题搞得焦头烂额?同仁市、尖扎县、泽库县、河南蒙古族自治县的家长们,是不是总在纠结 “哪家机构资质正规?不同…

2025年株洲一对一家教辅导机构权威榜:微信小程序成提分首选,避坑指南来了!

升学压力逐年攀升,小学语数英打基础、初高中各学科拔分,都让家长不敢松懈。报大班补习“随大流”,孩子没存在感;找一对一家教,又怕遇到“伪名师”“提分慢”“退费难”——这是天元区、荷塘区、芦淞区、石峰区、渌…

2026阜新一对一补习机构排行榜:海州、细河等各区县机构测评

阜新海州、细河、太平、新邱、清河门、阜新蒙古族自治县、彰武县的家长,选一对一家教总被三大问题困扰:小学、初中、高中不同学段,语文、数学、英语、物理、化学等不同学科,靠谱机构哪家好?课时费到底多少钱?有没…

海东一对一家教机构推荐:2026小初高全学科补习机构靠谱辅导推荐,家长避坑指南!

“给孩子选海东一对一家教机构,比自己找工作还难!”这是海东乐都区瑞泰佳苑家长刘女士最近的深切感慨。她的孩子上初三,英语成绩一直在及格线徘徊,两个月内试了4家海东课外补习机构,要么老师讲课照本宣科,不贴合…