消息队列 读和写两个进程不需要同时出现 (参考命名管道mkfifo)
Linux有POSIX和System V 两种消息队列
#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; //新建队列无意思 表示队列中消息队列数量
}
#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: 消息的优先等级及用来存储消息优先等级的指针
#include <mqueue.h>
//mqdes 消息队列描述符
int mq_notify(mqd_t mqdes, const struct sigevent* 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) */
};