基于ARM的智能灯光控制系统(6)进程通信
进程通信的作用
通信方式 | 程序中的功能 |
---|---|
消息队列 | 用于接受网页不同的事件请求 |
共享内存 | 实现主控程序与网页程序的数据共享 |
.
进程通信机制
进程通信头文件(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;
}