尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

使用信号量实现父子父子进程交替运行的学习笔记
📅 发布时间:2026/6/18 5:40:21

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

在学习进程同步机制时,信号量是一个非常重要的概念。相比于之前使用信号和全局变量实现进程同步的方式,信号量提供了更可靠、更灵活的同步机制。本文记录我使用 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. 可以添加共享内存,实现进程间的数据交换,结合信号量实现更复杂的同步逻辑

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

相关新闻

  • 2025 最新基质生产线厂家权威推荐榜:泥炭育苗栽培专用设备,全球测评优质厂家全解析花卉/营养土/椰糠/白泥炭/黑泥炭/齿轮筛基质生产线公司推荐
  • 朝阳市一对一辅导机构推荐,2026年课外家教补习机构权威排行榜
  • 蚌埠一对一辅导机构权威推荐:2025家教机构排行榜,穿透式测评!

最新新闻

  • 黄金暴涨:虚拟时代的原始信仰
  • 如何用免费在线工具深度分析无人机飞行日志:UAV Log Viewer完全指南
  • 炉石传说终极插件指南:如何用HsMod快速提升游戏体验
  • Digital-IDE:3步在VSCode中搭建专业硬件开发环境
  • 凯乐石携手小沓AI:加速品牌数字化转型,迈向AI驱动新未来
  • 如何免费解锁Cursor Pro功能:3步实现AI编程助手无限使用终极指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号