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. 车联网系统

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

    • 实时显示车辆状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式园姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值