沉下心学操作系统(八)进程间通信之消息队列

消息队列

​ 相比管道,消息队列不需要读取和写入进程同时出现,它就类似于邮箱,一个进程发送到邮箱,另一个进程看。消息队列可以和信号连用,然后每次来消息,就可以利用信号让收方得到通知。

#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
mqd_t mq_open(const char* name, int oflag, mode_t mode, struct mq_attr* attr);

​ 第一个参数是消息队列的名字,它是通过名字来识别的。用相同的名字打开消息队列,它们就会打开同一个消息队列。消息队列的名字格式是以/开头,由空字符结尾,中间最多包含255个不是/的字符串

​ 第二个参是访问消息队列的模式(只读、只写、可读可写,没有就创建),第三个参数第四个参分别代表消息队列的权限和性质(只有在创建的时候定义)

​ 其中第四个参数是一个结构体,里边存储最大消息数量、一个消息的最大长度、当前消息的数量等信息

​ 它的返回值是一个消息队列描述符。我们可以利用这个消息队列描述符来对消息队列进行发送或接收

发送和接收

#include <mqueue.h>
int mq_send(mqd_t mqdes, const char* msg_ptr, size_t msg_len, unsigned msg_prio);
ssize_t mq_receive(mqd_t mqdes, char* msg_ptr, size_t msg_len, unsigned* msg_prio);

​ 发送和接收函数的第一个参数代表消息队列描述符,第二个参数为发送/接收的消息,第三个参数为消息的长度,最后一个参数为存储消息优先等级的指针

获得新消息得到通知

#include <mqueue.h>
int mq_notify(mqd_t mqdes, const struct sigevent* sevp);

​ 第一个参数消息队列描述符,第二个参数为一个结构体,只要结构体中的sigev_notify的值为SIGEV_SIGNAL,每当有消息时,就可以让拥有标识符为mqdes的消息队列的进程获得信号提醒。

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/88795826
今日推荐