【Linux】进程间通信--消息队列

基本概念
消息队列就是由操作系统维护的消息链表,存放于内核中并由消息队列标识符标识,有够权限的进程可以向队列中添加消息,消息队列的生命周期不随进程随内核

  • 消息队列提供了一个从一个进程向另一个进程发送一块数据的方法
  • 每个数据块都被认为是一个类型,接收者进程的数据快可以有不同的类型值
  • 消息队列也有管道一样的不足,也就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)
消息队列与管道的比较
相同点:管道和消息队列都是进程间通信的方式

不同点:

  1. 管道的生命周期随进程,而消息队列的生命周期随内核
  2. 管道只能承载无格式字节流,而消息队列可以指定消息的类型
消息队列函数

创建|打开消息队列

  • int msgget(key_t key,int flag)//第一个参数相当于一个文件名,第二个参数如果不创建,默认为0,或者创建时加上IPC_CREAT | 0644表示该消息队列的权限,其实就是一个用来创建新的消息队列,一个访问已经存在的消息队列
  • 返回值:成功返回一个非负整数,即该消息队列的标识码;失败返回-1
查看消息队列
  • ipcs  -q 
控制消息队列
  • int msgctl(int msqid, int cmd , struct msqid_ds *buf)//第一个参数位队列标识符,第二个参数有三个选项,只了解一个IPC_RMID,用来销毁队列,第三个参数为NULL
  • 返回值:成功返回0(销毁成功);失败-1

往消息队列中发送数据

  • 首先必须先建立一个结构体
  • struct msgbuf    {  long  channel;//第一个必须是long类型    char text[1024];  };
  • int msgsnd(int msqid, void * msgp, size_t msgsz, int msgflg)//第二个参数是指向消息队列结构体的指针,第三个参数是消息结构体数组的大小(不包括channel)),最后一个参数一般设置为0,表示阻塞式等待
  • 返回值:成功返回0;失败返回-1
从消息队列中接收消息
  • size_t msgrcv(int msqid, void * msgp, size_t  msgsz, long msgtyp, int msgflg)//第二个参数是准备接收数据的地方,第三个数据是消息结构体的大小(不包括channel),最后一个参数一般默认为0
  • 返回值:成功返回0;失败返回-1
删除消息队列:
  • ipcrm  -Q  key
实现消息队列,代码如下
父进程接收消息,子进程发送消息

运行结果如下:

消息队列实现进程间通信的原理

无论进程间通信的方式是什么,本质就是让不同的进程想办法“看到”一份公共资源,这个临界资源就是migid所表示的消息队列,这样两个进程就实现了通信的目的



猜你喜欢

转载自blog.csdn.net/lw__sunshine/article/details/80985500