消息队列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号消息类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值