#Linux系统编程(消息队列)

(一)发行版:Ubuntu16.04.7


(二)记录:

(1)什么是消息队列

消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除

(2)msgget函数

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgget(key_t key,int msgflg);

参数:key_t key:和消息队列相关的key值

           int msgflg:访问权限

返回值:成功返回消息队列的ID,失败-1

(3)msgctl函数

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);

参数:int msqid:消息队列的ID

           int cmd:      IPC_STAT:读取消息队列的属性,然后把它保存在buf指向的缓冲区。

                              IPC_SET:设置消息队列的属性,这个值取自buf参数。

                              IPC_RMID:删除消息队列。

          struct msqid_ds  *buf: 消息队列的缓冲区

返回值:成功返回0,失败返回-1 

 (4)msgget创建消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
int main(void)
{
key_t key;
int msgid;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
return 0;
}

 查看消息队列和删除消息队列

(查看共享内存ipcs -m)(删除共享内存ipcrm -m 'mid') 

(5)msgsnd函数(发送消息)

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgsend(int msqid,const void *msgp,size_t msgsz,int msgfly)

参数:int msqid:                      消息队列ID

          const void *msgp:       指向消息类型的指针

          size_t msgsz:                 发送的消息的字节数

          int msgflg:            如果为0,直到发送完成函数才返回,即阻塞发送

                                       如果为IPC_NOWAIT:消息没有发送完成,函数也会返回,即非阻塞发送

返回值:成功返回0,失败返回-1

发送的格式:

struct msgbuf{

         long mtype;         //消息的类型

         char mtext[1];      //消息的内容

}

(6)msgrcv函数(接收消息) 

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

参数:  int msqid:消息队列ID

             void *msgp:接收消息的缓冲区

             size_t msgsz:接收消息的字节数

             long msgtyp:接收消息的标识  (写0即可,0代表接收消息队列中的第一个消息)

             int msgflg: 0表示阻塞读取,IPC_NOWAIT表示非阻塞读取

返回值:成功返回接收到的消息的长度,失败返回-1 

(7)通过消息队列进行消息的发送和读取

发送消息:

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

//发送的格式:
struct msgbuf{
long mtype;
char mtext[128];
};


int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//发送消息
msg.mtype=1;
strncpy(msg.mtext,"hello",5);
msgsnd(msgid,&msg,strlen(msg.mtext),0);   //第三个参数字节大小是正文的大小
return 0;
}

接收消息:

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

struct msgbuf{
long mtype;
char mtext[128];
};

int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//接收消息
msgrcv(msgid,(void *)&msg,128,0,0);
printf("msg type is %ld.\n",msg.mtype);
printf("msg content is %s\n",msg.mtext);
return 0;
}



(三)命令:

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值