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秒更新一次温度数据)
代码说明:
-
数据结构设计:
-
living_room_temp
:存储客厅温度值 -
bedroom_temp
:存储卧室温度值 -
update_flag
:简单的数据更新标志
-
-
进程分工:
-
传感器进程:模拟温度传感器(每个房间一个进程)
-
生成随机温度数据(20.0~30.0)
-
更新对应房间的温度值
-
设置更新标志位
-
-
显示进程:统一显示数据
-
监控更新标志位
-
显示最新温度后重置标志位
-
-
-
关键技术点:
-
shmget
:创建/获取共享内存 -
shmat
:将共享内存映射到进程地址空间 -
简单标志位实现数据更新通知(实际生产环境建议使用信号量)
-
编译运行:
gcc -o smart_home smart_home.c
./smart_home
应用场景扩展:
-
智能家居系统:
-
集成更多传感器(湿度、光照)
-
添加自动控制逻辑(温度超过阈值启动空调)
-
-
工业监控系统:
-
监控多台设备状态
-
异常数据报警功能
-
-
车联网系统:
-
收集多个车载传感器数据
-
实时显示车辆状态
-