基于ARM的智能灯光控制系统(6)进程通信
2016-10-20 14:43
295 查看
基于ARM的智能灯光控制系统(6)进程通信
进程通信的作用通信方式 | 程序中的功能 |
---|---|
消息队列 | 用于接受网页不同的事件请求 |
共享内存 | 实现主控程序与网页程序的数据共享 |
进程通信机制
Created with Raphaël 2.1.0网页程序1网页程序1主控程序主控程序网页程序2网页程序2显示系统数据消息队列(0x01)更新共享内存设置系统数据消息队列(0x02)更新共享内存、链表,保存文件
进程通信头文件(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; }
相关文章推荐
- 基于ARM的智能灯光控制系统(6)进程通信
- 基于ARM的智能灯光控制系统总结(13-网页CGI进程之进程通信头文件)
- 基于ARM的智能灯光控制系统总结(14-网页CGI进程之网页数据提取函数)
- 基于ARM的智能灯光控制系统总结(16-网页CGI进程之设备管理)
- 基于ARM的智能灯光控制系统总结(19-网页CGI进程之makefile)
- 基于ARM的智能灯光控制系统总结(12-网页CGI进程之网页布局函数)
- 基于ARM的智能灯光控制系统总结(17-网页CGI进程之区域添加)
- 基于ARM的智能灯光控制系统总结(15-网页CGI进程之设备添加)
- 基于ARM的智能灯光控制系统总结(8-网络客户端进程)
- 基于ARM的智能灯光控制系统总结(11-网页CGI进程之欢迎界面)
- 基于ARM的智能灯光控制系统总结(18-网页CGI进程之区域管理)
- 基于ARM的智能灯光控制系统总结(10-主控进程的makefile文件)
- 基于ARM的智能灯光控制系统总结(9-主控进程的设备状态更新线程)
- 基于ARM的智能灯光控制系统(10)网络节点
- 基于ARM的智能灯光控制系统总结(1-项目介绍)
- 基于ARM的智能灯光控制系统(8)设备添加
- 基于ARM的智能灯光控制系统(10)网络节点
- 基于ARM的智能灯光控制系统(11)状态更新
- 基于ARM的智能灯光控制系统(2)需求分析
- 基于ARM的智能灯光控制系统(9)设备管理