消息队列api简介



消息队列:

简介:

消息队列同管道一样为进程间通信提供了一种有效的方式。它的优势在于它独立于发送和
接收进程而存在,它不受读写端是否关闭而影响。消息队列有相关类型,我们可以选择
接收什么样的类型。
1.消息队列的函数头文件#include<sys/msg>

int msgget(ket_t key,int msgflg)
与大多数IPC机制一样,key相当于它的名字,flg多取IPC_CREAT,返回的如同相应文件的
标识符,如果已有就直接打开没有就建立,与open系统调用类似。

int msgsnd(int msqid, const void *msg_ptr,size_t msg_sz,int msgflg)
struct
这个函数用来向消息队列发送消息,第一个参数就是IPC机制的通用意思就是文件标识符。
第二个参数是待发送消息的指针,这个指针我们可以定义成为如下的结构体。
struct mess
{
 long int type;
 xx buff[xx];
}
但该指针要求从type类型开始,所以我们可以做这样定义。第三个参数是不包括长整形
参数在内的消息长度。第四个参数是控制如果消息队列满了我们如何应答,如果设置
IPC_NOWAIT标志,函数立刻返回-1.如果没有则进程将被挂起等待有相应类型的消息。

int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg)
前三个参数都如上,最后一个参数如上如果选择IPC_NOWAIT就是直接返回-1,如果选择0
相同效果第四个参数取0,其实就是接受所有信息,想接受那个类型的信息就填数字几,
如果想接受小于数字n的消息可以填-n。

int msgctl(int msqid,int command,struct msqid_ds *buf)
第一个参数取标识符,第二个有三个参数IPC_RMID为删除消息队列。第三个参数是
和第二个参数其他选项配合使用的。


程序:

接收
struct mess
{
        long type;
        char buff[128];
};
int main()
{
        int msgid=msgget((key_t)1234,IPC_CREAT|0600);
        assert(msgid!=-1);


        struct mess dt;

        msgrcv(msgid,(void *)&dt,128,1,0);
        printf("buff=%s\n",dt.buff);

}

发送
struct mess
{
        long type;
        char buff[128];
};
int main()
{
        int msgid=msgget((key_t)1234,IPC_CREAT|0600);
        assert(msgid!=-1);


        struct mess dt;
        dt.type=1;

        printf("input:\n");
        char buff[128]={0};
        fgets(buff,128,stdin);

        strcpy(dt.buff,buff);

        msgsnd(msgid,(void *)&dt,128,0);

}
本程序为了简介将char设为1号消息类型。

猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/79487632