进程消息队列实例

发布时间 2023-03-28 17:39:30作者: 踏浪而来的人
//write.c

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


struct mymesg{
    long mtype;//消息的类型,是一个整数且大于0
    char mtex[512];//消息数据本身,是第三个参数的内容
};

int mian()
{
    char *str = "hello world";
    struct mymesg m1;
    m1.mtype = 100;
    memcpy(m1.mtex, str, sizeof(str));
    
    key_t key = ftok("./", 0);
    
    //int msgget(key_t key, int msgflg)
    int msq_id = msgget(key, IPC_CREAT|IPC_EXCL|0777);
    if(msq_id < 0){
        printf("create message queue failed\n");
        return -1;
    }
    
    //ssize_t  msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
    if(msgsnd(msq_id, &m1, sizeof(struct mymesg)-sizeof(long), 0) < 0){
        printf("send failed\n");
    }
    

    return 0;
}
//read.c

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


struct mymesg{
    long mtype;//消息的类型,是一个整数且大于0
    char mtex[512];//消息数据本身,是第三个参数的内容
};

int mian()
{struct mymesg m1;
    m1.mtype = 100;
    
    key_t key = ftok("./", 0);
    
    //int msgget(key_t key, int msgflg)
    int msq_id = msgget(key, 0777);
    if(msq_id < 0){
        printf("open message queue failed\n");
        return -1;
    }
    
    //ssize_t msgrcv(int msgqid,void *ptr,size_t nbytes,long type,int flag)
    if(msgrcv(msq_id, m1.mtex, sizeof(struct mymesg) - sizeof(long), m1.mtype, 0) < 0){
        printf("receive failed\n");
    }else{
     printf("mtex = %s\n",m1.mtex);
  }
return 0; }