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

linux进程通信之共享内存实例

场景:一个简单的 智能家居温度监控系统 的共享内存应用实例,模拟多个传感器进程写入数据、一个显示进程读取数据。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <time.h>

#define SHM_KEY 0x1234

// 共享内存数据结构(存储温度数据)
typedef struct {
    float living_room_temp;  // 客厅温度
    float bedroom_temp;      // 卧室温度
    int update_flag;         // 数据更新标志(0=未更新 1=已更新)
} temp_data;

// 传感器进程(写入数据)
void sensor_process(const char *room_name) {
    int shmid = shmget(SHM_KEY, sizeof(temp_data), 0666);
    temp_data *shm = (temp_data*)shmat(shmid, NULL, 0);

    srand(time(NULL) + getpid()); // 随机种子
    
    while(1) {
        float temp = 20.0 + (rand() % 100)/10.0; // 生成20.0~30.0的随机温度
        
        if(strcmp(room_name, "living_room") == 0) {
            shm->living_room_temp = temp;
        } else {
            shm->bedroom_temp = temp;
        }
        
        shm->update_flag = 1; // 标记数据已更新
        sleep(2); // 每2秒更新一次
    }
}

// 显示进程(读取数据)
void display_process() {
    int shmid = shmget(SHM_KEY, sizeof(temp_data), IPC_CREAT | 0666);
    temp_data *shm = (temp_data*)shmat(shmid, NULL, 0);
    
    while(1) {
        if(shm->update_flag) {
            printf("\n=== 家庭温度监控 ===\n");
            printf("客厅: %.1f°C\n", shm->living_room_temp);
            printf("卧室: %.1f°C\n", shm->bedroom_temp);
            shm->update_flag = 0; // 重置标志位
        }
        sleep(1); // 每秒检查一次
    }
}

int main() {
    // 创建共享内存
    int shmid = shmget(SHM_KEY, sizeof(temp_data), IPC_CREAT | 0666);
    
    // 创建显示进程
    if(fork() == 0) {
        display_process();
        exit(0);
    }

    // 创建两个传感器进程
    if(fork() == 0) {
        sensor_process("living_room");
        exit(0);
    }
    
    if(fork() == 0) {
        sensor_process("bedroom");
        exit(0);
    }

    // 等待子进程(实际应用中应有更完善的等待逻辑)
    wait(NULL);
    
    // 清理资源(此处简化处理)
    shmctl(shmid, IPC_RMID, NULL);
    return 0;
}
实现效果:
=== 家庭温度监控 ===
客厅: 23.5°C
卧室: 25.8°C

=== 家庭温度监控 ===
客厅: 26.1°C
卧室: 24.3°C

=== 家庭温度监控 ===
客厅: 22.9°C
卧室: 27.4°C
(每2秒更新一次温度数据)
 
代码说明:
  1. 数据结构设计

    • living_room_temp:存储客厅温度值

    • bedroom_temp:存储卧室温度值

    • update_flag:简单的数据更新标志

  2. 进程分工

    • 传感器进程:模拟温度传感器(每个房间一个进程)

      • 生成随机温度数据(20.0~30.0)

      • 更新对应房间的温度值

      • 设置更新标志位

    • 显示进程:统一显示数据

      • 监控更新标志位

      • 显示最新温度后重置标志位

  3. 关键技术点

    • shmget:创建/获取共享内存

    • shmat:将共享内存映射到进程地址空间

    • 简单标志位实现数据更新通知(实际生产环境建议使用信号量)

编译运行:
gcc -o smart_home smart_home.c
./smart_home
应用场景扩展:
  1. 智能家居系统

    • 集成更多传感器(湿度、光照)

    • 添加自动控制逻辑(温度超过阈值启动空调)

  2. 工业监控系统

    • 监控多台设备状态

    • 异常数据报警功能

  3. 车联网系统

    • 收集多个车载传感器数据

    • 实时显示车辆状态

相关文章:

  • 【Javascript网页设计】在线图片画板案例
  • BambuStudio学习笔记:FaceDetector类
  • 模块13.异常_Object
  • 服务器CPU微架构
  • LeetCode 解题思路 10(Hot 100)
  • XTDrone+Mavros+Gazebo仿真——配置与控制不同的无人机
  • DeepSeek赋能智慧工厂:推动制造业高效智能可持续,开启制造业转型升级
  • hi3516cv610适配AIC8800D80的连接路由器记录
  • 文件上传和下载前后端交互逻辑
  • leetcode1 两数之和 哈希表
  • 极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【四】
  • Golang的多团队协作开发
  • 设计模式|策略模式 Strategy Pattern 详解
  • BambuStudio学习笔记:FlushVolCalculator类
  • doris: Oracle
  • ROM修改进阶教程------修改安卓机型SELinux宽容的几种方式方法 以及第三方系统中如何关闭SELinux宽容
  • 【AD】5-2 DXF结构导入与板框自定义
  • skynet简单游戏服务器的迭代
  • Spring AI 接入 DeepSeek AI
  • 【linux 安装mongodb】在redhat9上安装mongodb8出现下载元数据错误
  • 《致1999年的自己》:千禧之年的你在哪里?
  • 婚姻登记“全国通办”首日观察:数据多跑路,群众少跑腿
  • 竞彩湃|德甲欧冠资格竞争白热化,伯恩茅斯主场迎恶战
  • 上报集团社长李芸:发挥媒体优势,让中非民心在数字时代更深层互联互通
  • 中华人民共和国和俄罗斯联邦在纪念中国人民抗日战争、苏联伟大卫国战争胜利和联合国成立80周年之际关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 经彩申城!上海网络大V沙龙活动走进闵行