代码示例_IPC_消息队列

消息队列

 


 

 

1.头文件

#ifndef __MSG_H__
#define __MSG_H__

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct{
    long mtype;
    char mtext[1024];
}msgbuf;


key_t Get_Key(void);
int Msg_Creat(key_t key);
ssize_t Msg_Read(int msgid,void *msg_buf, size_t msg_size);
int Msg_Write(int msgid, const void *msg_buf, size_t msg_size);
int Msg_Delet(int msgid);



#endif

2. msg.c

#include"msg.h"


//获取key
key_t Get_Key(void)
{
    key_t key =ftok("/",0x66);
    if(key <0){
        perror("Get_Key ftok failed");
        exit(1);
    }
    return key;
}

//创建获取
int Msg_Creat(key_t key)
{
    int msgid = msgget(key,0666|IPC_CREAT);
    if(msgid<0){
        perror("msgget failed");
        exit(1);
    }
    return msgid;
}


//
ssize_t Msg_Read(int msgid,void *msg_buf, size_t msg_size)
{
    ssize_t msgrcv_num =msgrcv(msgid,msg_buf,msg_size,0,0);
    if(msgrcv_num <0){
        perror("Msg_Read msgrcv failed");
        exit(1);
    }
    return msgrcv_num;
}

//
int Msg_Write(int msgid, const void *msg_buf, size_t msg_size)
{
    int msgsnd_num =msgsnd(msgid,msg_buf,msg_size,0);
    if(msgsnd_num<0){
        perror("Msg_Write msgsnd failed");
        exit(1);
    }
    return msgsnd_num;
}


//删除
int Msg_Delet(int msgid)
{
    int msgctl_rel =msgctl(msgid,IPC_RMID,NULL);    
    if(msgctl_rel <0){
        perror("Msg_Delet msgctl failed");
        exit(1);
    }
    return msgctl_rel;
}


2.server

#include "msg.h"

msgbuf msgbuf_t;

int main(void)
{
    key_t key =Get_Key();
    int msgid =Msg_Creat(key);
    memset(&msgbuf_t, 0, sizeof(msgbuf_t));    
    while(1){
        msgbuf_t.mtype =6;
        Msg_Read(msgid,&msgbuf_t,sizeof(msgbuf_t));
        fputs(msgbuf_t.mtext, stdout);
        if(strncmp(msgbuf_t.mtext, "quit", 4)==0)
            break;
    }
    Msg_Delet(msgid);
    
    return 0;
}

3.client

#include "msg.h"

msgbuf msgbuf_t;

int main(void)
{
    key_t key =Get_Key();
    int msgid =Msg_Creat(key);
    memset(&msgbuf_t, 0, sizeof(msgbuf_t));    
    while(1){
        msgbuf_t.mtype =6;
        fgets(msgbuf_t.mtext, 1024, stdin);
        Msg_Write(msgid,&msgbuf_t,sizeof(msgbuf_t));
        if(strncmp(msgbuf_t.mtext, "quit", 4)==0)
            break;
    }
    Msg_Delet(msgid);    
    
    return 0;
}

 

 


 

 

 

 success !

 

 

 

Stay hungry, stay foolish 待续。。。
原文地址:https://www.cnblogs.com/panda-w/p/11049411.html