天天看點

POSIX message queue

http://hi.baidu.com/gaomanyi/blog/item/5a0be53620ef46380b55a955.html

POSIX消息隊列可以認為是一個連結清單。有足夠寫權限的線程都可以往隊列中放置消息, 有足夠讀權限的線程都可以從隊列中取走消息, 每個消息是一個記錄, 它由發送者賦予一個優先級。在某個程序往一個隊列寫入消息之前, 并不需要另外某個程序在該隊列上等待消息的到達。

一個程序可以往某個 隊列寫入一些消息後終止, 讓另外一個程序在某個時刻讀出這些消息。我們說消息隊列具有随核心的持續性。

列舉函數和接口如下:

#include<mqueue.h>

mqd_t mq_open(const char *name,int oflag,...);

int mq_close(mqd_t mqdes);

int mq_unlink(const char *name);

int mq_getattr(mqd_t mqdes,struvt mq_attr *attr);

int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *attr);

int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);

ssize_t mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);

int mq_notify(mqd_t mqdes,const struct sigevent *notification);//異步通知消息到達:産生一個信号,或建立一個線程執行一個指定的函數

struct mq_attr{

long mq_flags;

long mq_maxmsg;

long mq_msgsize;

long mq_curmsgs;

};

union sigval {

int sival_int;

void *sival_ptr;

};

struct sigevent{

int sigev_notify;

int sigev_sigev_signo;

union sigval sigev_value;

void (*sigev_notify_function)(union sigval);

pthread_attr_t *sigev_notify_attributes;

};

繼續閱讀