当前位置: 首页 > 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.jsqmd.com/news/45486/

相关文章:

  • 基于MATLAB实现图像缺陷检测、清晰度评估及自动对焦功能
  • 托福提分认准这些!2025五大靠谱机构推荐,从基础到冲刺全覆盖
  • 海南州一对一辅导机构靠谱推荐:2026最新教育机构榜! 持证师资精准发力
  • 2025 最新切割工程队推荐!混凝土 / 桥梁 / 支撑梁 / 无损切割等全场景工程队口碑排行榜,专业服务权威推荐
  • 2025年淮南一对一家教机构推荐:五大辅导机构测评排行榜,综合实力全解析!
  • 2025 最新基质生产线厂家权威推荐榜:泥炭育苗栽培专用设备,全球测评优质厂家全解析花卉/营养土/椰糠/白泥炭/黑泥炭/齿轮筛基质生产线公司推荐
  • 2025 最新解压机厂家权威推荐榜:椰糠 / 泥炭 / 基质解压机源头厂家测评优选,聚焦专业服务与市场口碑
  • 从源码编译安装gdal3.6.2库
  • 2025 最新包装盒厂家推荐排行榜:一站式定制解决方案权威测评,涵盖食品、美妆、礼品等多领域优质品牌彩盒印刷/茶叶礼盒/烘焙包装盒订制公司推荐
  • 朝阳市一对一辅导机构推荐,2026年课外家教补习机构权威排行榜
  • 完整教程:ctf.show--web入门--爆破
  • 2025 最新工程造价公司咨询推荐榜:国际权威测评认证的全行业靠谱服务商优选指南上海/工程造价审核/工程造价全过程跟踪审计/工程预算造价/厂房工程造价审核/工程结算造价审核公司推荐
  • element-plus表格相同行合并工具
  • 蚌埠一对一辅导机构权威推荐:2025家教机构排行榜,穿透式测评!
  • html-webpack-plugin与PWA:生成Service Worker兼容HTML - 详解
  • 锦州一对一家教机构推荐:2025年辅导机构权威排行榜,5家机构避坑指南
  • 黄南州一对一补习机构良心推荐:2026最新家教机构榜单!费用透明不花冤枉钱
  • 海东一对一家教机构推荐:2026小初高全学科补习机构靠谱辅导推荐,家长避坑指南!
  • 上海一对一辅导机构怎么选?2025最新权威排行榜揭晓,避坑指南 + 优选名单!
  • 海北一对一家教机构精选推荐:2026 师资 效果双优辅导机构榜单!
  • 长沙一对一课外辅导机构权威推荐榜单:2025年精准避坑,提分有方向
  • 2025年目前做得好的牙齿修复找哪家,牙周治疗/老人牙齿修复/进口牙齿种植/老年人牙齿种植/口腔牙齿种植牙齿修复排行榜推荐排行榜
  • 海西州一对一家教机构推荐,2026年教育机构最新盘点口碑实测榜!
  • 2025 年鞍山一对一课外辅导机构推荐:家教补习机构权威排行榜
  • 长沙一对一课外辅导机构推荐:2025权威榜单来了,精准提分不踩坑
  • 这所双非高校在AAAI 2026上发表11篇论文
  • 抚顺一对一家教辅导机构推荐,2025年家教补习平台权威排行榜
  • 大连一对一辅导机构推荐,2025年课外家教补习机构权威排行榜
  • 2025年深圳广告标识公司权威推荐榜单:LED发光字/门头招牌/企业形象墙服务商精选
  • 联系我 —— 联系方式