最近在搞进程间通信,首先在我的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
service.c

相关文章:

  • 2021-06-07
  • 2022-01-02
  • 2021-08-01
  • 2022-02-23
  • 2021-08-27
猜你喜欢
  • 2022-12-23
  • 2021-12-20
  • 2021-08-14
  • 2021-11-15
  • 2021-04-04
相关资源
相似解决方案