当前位置: 首页 > 工具软件 > Open-MQ > 使用案例 >

linuxC消息队列 mq_open() mq_send() mq_receive() mq_notify()

田俊爽
2023-12-01

消息队列 读和写两个进程不需要同时出现 (参考命名管道mkfifo)

Linux有POSIX和System V 两种消息队列

  • POSIX消息队列 打开消息队列mq_open() 成功返回一个消息队列描述符
#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);
  • name: 由“/”开头、空字符"\0"结尾、中间最多包含255个不是“/”字符的字符串

  • oflag:访问此消息队列的模式,如O_RDONLY、O_CREAT(此时可加入O_EXCL)、OWRONLY、WRDWR

  • oflag值为O_CREAT需要后2个形参;mode为权限,与open()的mode一样;attr表示消息队列的性质,值为NULL表示新建消息队列为默认设置

  • attr结构体

    struct mq_attr {
        long mq_flags; //值为O_NONBLOCK 表示马上返回不等待
        long mq_maxmsg; //包含的最大消息数量
        long mq_msgsize; //一条消息最大长度,单位字节
        long mq_curmsgs; //新建队列无意思 表示队列中消息队列数量
    }
    

  • 消息队列 发送mq_send()、接收mq_receive() 信息
#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);
  • mqdes: 消息队列描述符

    msg_ptr: 发送/接收 消息的缓冲区指针

    msg_len: 发送消息长度 / 接收信息缓冲区长度

    msg_prio: 消息的优先等级及用来存储消息优先等级的指针


  • mq_notify() 进程在获得新消息时得到通知,无需等待或轮询。消息队列特有
#include <mqueue.h>
//mqdes 消息队列描述符
int mq_notify(mqd_t mqdes, const struct sigevent* sevp);
  • sevp结构
union sigval {          /* Data passed with notification */
    int     sival_int;         /* Integer value */
    void   *sival_ptr;         /* Pointer value */
};

struct sigevent {
    int          sigev_notify; /* Notification method */
    int          sigev_signo;  /* Notification signal */
    union sigval sigev_value;  /* Data passed with
                                  notification */
    void       (*sigev_notify_function) (union sigval);
                     /* Function used for thread
                        notification (SIGEV_THREAD) */
    void        *sigev_notify_attributes;
                     /* Attributes for notification thread
                        (SIGEV_THREAD) */
    pid_t        sigev_notify_thread_id;
                     /* ID of thread to signal (SIGEV_THREAD_ID) */
};

 类似资料: