基於ARM的智能燈光控制系統(6)進程通信
進程通信的作用
通信方式 | 程序中的功能 |
---|---|
消息隊列 | 用於接受網頁不同的事件請求 |
共享內存 | 實現主控程序與網頁程序的數據共享 |
.
進程通信機制
Note left of 網頁程序1: 顯示系統數據
網頁程序1->主控程序: 消息隊列(0x01)
Note left of 主控程序: 更新共享內存
Note right of 網頁程序2: 設置系統數據
網頁程序2->主控程序: 消息隊列(0x02)
Note right of 主控程序: 更新共享內存、鏈表,保存文件
進程通信頭文件(sys_ipc.h)
函數 | 功能 |
---|---|
ipcs_pro | 通信處理線程,接收網頁事件進行處理 |
get_msgid_web | 獲得消息隊列ID |
msg_recv_webreq | 接收網頁消息隊列的消息 |
set_web_shm | 設置共享內存 |
shm_to_stu | 共享內存數據更新到全局結構體 |
stu_to_shm | 全局結構體數據更新到共享內存 |
.
#ifndef _SL2000_SYS_IPC_H
#define _SL2000_SYS_IPC_H
#include "config.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
void* ipcs_pro(void* arg);
int get_msgid_web(void);
int msg_recv_webreq(int msgid);
void* set_web_shm(void);
int shm_to_stu(const struct sys_all* shm_dev);
int stu_to_shm( struct sys_all* shm_dev);
進程通信實現文件(sys_ipc.c)
#include "sys_ipc.h"
#include "config.h"
#include "link_pro.h"
extern struct sys_all g_dev[1];
extern struct sys_dev *head_node;
int area_update_flag;
void* ipcs_pro(void* arg)
{
int msgid_web;
struct sys_all* shm_dev=NULL;
int i,cmd;
printf("ipcs pthread start...\n");
if((msgid_web=get_msgid_web()) < 0){
printf("msg_web error\n");
exit(1);
}
if((shm_dev=(struct sys_all*)set_web_shm())==NULL){
printf("shm_web error\n");
exit(1);
}
stu_to_shm(shm_dev);
while(1){
cmd = msg_recv_webreq(msgid_web);
switch(cmd){
case 1://網頁更新0x01
stu_to_shm(shm_dev);
break;
case 2://設置更新0x02
shm_to_stu(shm_dev);
save_dev(g_dev);
head_node = stu_to_link(head_node);
area_update_flag = 1;
break;
default:
break;
}
sleep(2);
}
}
int get_msgid_web(void)
{
int id = -1;
id = msgget((key_t)1234,0666|IPC_CREAT);
if(id == -1){
printf("msgget error\n");
exit(1);
}
return id;
}
int msg_recv_webreq(int msgid)
{
int i,ret;
long int msg_type;
struct st_msg_req cmd;
msg_type = WEB_UPDATE_SMG_INDEX;
if(msgrcv(msgid,(void*)&cmd,1,msg_type,IPC_NOWAIT)==-1){
return -1;
}else{
//if(cmd.req==0x1)
ret = cmd.req;
printf("recv %d cmd...\n",ret);
return ret;
}
return 0;
}
void* set_web_shm(void)
{
int shmid;
void* shmaddr=(void*)0;
if((shmid=shmget((key_t)1122,sizeof(struct sys_all),0666|IPC_CREAT))<0){
return NULL;
}else{
if((shmaddr=shmat(shmid,(void*)0,0))==(char *)-1){
return NULL;
}
}
printf("set shm ok...\n");
return shmaddr;
}
int stu_to_shm( struct sys_all* shm_dev)
{
int i;
if(shm_dev==NULL)
return -1;
memcpy(shm_dev,g_dev,sizeof(struct sys_all));
return 0;
}
int shm_to_stu(const struct sys_all* shm_dev)
{
int i;
if(shm_dev==NULL)
return -1;
memcpy(g_dev,shm_dev,sizeof(struct sys_all));
return 0;
}