最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下:
接口文件ipcmsg.h
/* ipcmsg.h */ #ifndef H_MSGIPC_H #define H_MSGIPC_H
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <ipcmsg.h>
#define MSGKEY 666 #define BUF_SIZE 64 #define APP_PARA_LEN 16 #ifdef __cplusplus extern "C"{ #endif typedef enum ipc_msg_type { APP_MSG, INPUT_MSG, GPS_MSG }ipc_type_t ; typedef struct msgIpc { ipc_type_t type; char buf[BUF_SIZE]; }ipc_msg_t; typedef enum app_cmd { //RECORD CMDS START_RECORD = 1001, STOP_RECORD, GET_RECORD_TIME, SWITCH_CAMERA, TAKE_PICTURE, //FILE PROCESS GET_FILE_LIST = 2001, DELETE_FILE, //SETTINGS SET_VIDEO_RESOLUTION = 3001, GET_VIDEO_RESOLUTION, SET_GSENSOR , GET_GSENSOR , SET_PARKING , GET_PARKING, SET_AUTO_RECORD, GET_AUTO_RECORD, SET_SOUNDINDICATOR, GET_SOUNDINDICATOR,//3010 SET_LOOPING, GET_LOOPING, SET_LANGUAGE, GET_LANGUAGE, SET_WIFI, GET_WIFI, SET_TIME, GET_SD_INFO, FORMAT_SD, FACTORY_RESET,//3020 GET_DEVICE_INFO, GET_ALL_SETTINGS, ADJUST, ADJUST_CONTINUOUS, //NOTIFY NOTIFY = 4001 } app_cmd_t; typedef struct app_data{ app_cmd_t type; int fd; int id ; char code[APP_PARA_LEN]; char value[APP_PARA_LEN]; }app_data_t; //return msqid if success extern int initIpcMsg(key_t msqkey); //remove a msq extern int exitIpcMsg(key_t msqkey); //send ipc msg extern int sendIpcMsg(key_t msqkey, const ipc_msg_t *msg); //recv ipc msg extern int recvIpcMsg(key_t msqidkey, ipc_msg_t *msg); #ifdef __cplusplus } #endif/*end of _cplusplus*/ #endif/*end of H_MSGIPC_H*/
对应的ipcmsg.c如下:
/*ipcmsg.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #include "ipcmsg.h" //return msqid if success int initIpcMsg(key_t msqkey) { int msqid = -1; msqid=msgget(msqkey,IPC_EXCL); /*check msq*/ if(msqid < 0){ msqid = msgget(msqkey,IPC_CREAT|0666);/*create msq*/ if(msqid <0){ perror("failed to create msq"); return -1; } } else { printf("msqid %d exist\n", msqid); return -2; } return msqid; } //remove a msqid int exitIpcMsg(key_t msqkey) { int msqid = -1; msqid=msgget(msqkey,IPC_EXCL); /*check msq*/ if(msqid <0){ perror("failed to get msq"); return -1; } return msgctl(msqid,IPC_RMID,0); //remove msq } int sendIpcMsg(key_t msgkey, const ipc_msg_t *msg) { char str[256]; int ret = 0, msqid =0; if(NULL == msg) return -1; msqid=msgget(msgkey,IPC_EXCL); /*检查消息队列是否存在*/ if(msqid < 0){ perror("failed to create msq"); return -2; } ret= msgsnd(msqid,msg,sizeof(ipc_msg_t ),IPC_NOWAIT); if ( ret< 0 ) { perror("msgsnd() write msg failed"); } return ret; } /* return byte of msg if success else reurn less than 0 */ int recvIpcMsg(key_t msgkey, ipc_msg_t *msg) { int msgid = 0,ret = 0; char str[512]; //first check parameter if(NULL == msg) return -1; //second check if the msgqueue exit msgid = msgget(msgkey,IPC_EXCL ); if(msgid < 0){ //perror("msq not existed!"); return -2; } //third get msg ret= msgrcv(msgid,msg,sizeof(ipc_msg_t),msg->type,0); if(ret < 0) perror("get msg failed"); return ret; }
接下来测试用的demon分为三个文件,一个send用来发送数据 一个recv用来接收数据 还有一个service(用来启动和结束消息队列)
服务启动端service.c
/*service.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #include "ipcmsg.h" #ifdef IPCST int main() { ipc_msg_t msg = {.type = APP_MSG,}; int ipc_msg_type = APP_MSG; app_data_t adat = {.type = 3021, .fd =12, .id =8}; int msqid = 0; msqid=initIpcMsg(MSGKEY); /*init msq*/ if(msqid < 0){ return -1; } printf("start ipc key 0x%x msqid %d\n", MSGKEY, msqid); sleep(20); printf("exit ipc key 0x%x msqid %d\n", MSGKEY, msqid); return exitIpcMsg(MSGKEY); //remove msq } #endif