本文共 2987 字,大约阅读时间需要 9 分钟。
进程通信的作用
通信方式 | 程序中的功能 |
---|---|
消息队列 | 用于接受网页不同的事件请求 |
共享内存 | 实现主控程序与网页程序的数据共享 |
.
进程通信机制
Note left of 网页程序1: 显示系统数据 网页程序1->主控程序: 消息队列(0x01)Note left of 主控程序: 更新共享内存Note right of 网页程序2: 设置系统数据网页程序2->主控程序: 消息队列(0x02)Note right of 主控程序: 更新共享内存、链表,保存文件
函数 | 功能 |
---|---|
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#include #include #include 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);
#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; }
转载于:https://blog.51cto.com/91arm/2052473