linux进程通信之消息队列

消息队列:

类似于有名管道,使用消息队列的进程也不必具备亲缘关系,任意两个进程间均可以使用消息队列通信。

不过消息队列独立于发送和接收的进程,因此就不必考虑同步的问题,这一点相对有名管道而言是一个优势。

消息队列以数据块传送数据,每个数据块是一个以长整型开头的结构体。

消息队列的几个方法如下:

int msgget(key_t key, int msgflg);

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">此方法成功执行会返回新的消息队列描述符,否则返回-1.key是和描述符相关的键值,当key是IPC_PRIVATE时,会返回一个新私有队列的描述符,理论上只能当前进程访问。当key是一个普通的键值时,方法会返回key值对应的队列描述符,当队列不存在时,而msgflg制定了IPC_CREAT,方法会返回一个与该键值相关的新的描述符。所以msgflag是权限标志,一般情况都和IPC_CREAT做或操作。</span>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

此方法是控制消息队列的方法。msqid就是上一个方法返回的描述符,cmd是对消息队列所进行的操作

IPC_STAT  把消息队列的关联值复制到buf

IPC_SET    把消息队列的关联值设置为buf指向的值

IPC_RMID  删除消息队列


<span style="font-size:18px;">int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);</span>


此方法向消息队列添加消息,msgp是一个执行消息结构体的指针。消息结构体必须定义成如下格式:

struct my_mess{
    long int mess_type;
    char my_text[SIZE];
};

msgsz是数据块的大小,msgflg用于控制当前消息队列满或者队列消息到达系统范围的限制时将要发生的事情。

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);


此方法接收来自msqid队列的消息,msftyp是消息结构中的long型参数。

下面是一个小案例:

messsend.c

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

#define SIZE 1024

struct my_mess{
    long int mess_type;
    char my_text[SIZE];
};
void main(){
    int mess_id;
    char buff[SIZE];
    struct my_mess mess;
    mess_id=msgget((key_t)1234,0666|IPC_CREAT);
    if(mess_id==-1){
        printf("create message failed!\n");
        exit(EXIT_FAILURE);
    }

    while(1){
        printf("send>> ");
        fgets(buff,SIZE,stdin);
        mess.mess_type = 1;
        strcpy(mess.my_text,buff);
        if(msgsnd(mess_id,(void *)&mess,SIZE,0)==-1){
            printf("send message failed!\n");
            exit(EXIT_FAILURE);
        }
        if(strncmp(buff,"quit",4)==0)break;
    }
    exit(EXIT_SUCCESS);
}


messreceive.c

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

#define SIZE 1024
struct my_mess_t{
    long int my_mess_type;
    char mess_text[SIZE];
};
void main(){
    struct my_mess_t mess;
    int mess_id;
    char buff[SIZE];
    long int mess_rec = 0;
    mess_id = msgget((key_t)1234,0666|IPC_CREAT);
    if(mess_id==-1){
        printf("create message error!\n");
        exit(EXIT_FAILURE);
    }
    while(1){
        if(msgrcv(mess_id,&mess,SIZE,mess_rec,0)==-1){
            printf("receive mess failed!\n");
            exit(EXIT_FAILURE);
        }
        printf("receive:%s",mess.mess_text);
        if(strncmp(mess.mess_text,"quit",4)==0)break;
    }
    if(msgctl(mess_id,IPC_RMID,0)==-1){
        printf("delete mess failed!\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

执行结果:



以上内容参考博客:

http://blog.csdn.net/ljianhui/article/details/10287879,不对之处还请大家批评指正!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值