Richard Steven的大作:
header file: mqueue.h
mqd_t mq_open(const char *name, int oflag, ...);
int mq_close(mqd_t mqdes);
int mq_unlink(const char *name);
回傳一個handler,型態為mqd_t,close表示關閉,unlink並不會真正刪除,而是隨著系統對close作count,直到count=0,也就是最後一個process使用close,才會刪除message queue
int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
int mq_setattr(mqd_t mqdes, struct mq_attr *attr,mq_attr *oattr);
struct mq_attr{
long mq_flags;
long mq_maxmsg;
long mq_msgsize;
long mq_curmsgs;
};
可以取得各種屬性,其中mq_maxmsg跟mq_msgsize都只能在mq_open的時候設定,免得硬要把已經在msg queue內的message縮小,這樣的操作屬於不合理
message queue收送
int mq_send(mqd_t mqdes,const char *ptr, size_t len, unsigned int prio);
ssize_t mq_receive(mqd_t mqdes,const char *ptr, size_t len, unsigned int prio);
書中有提到一個問題就是message queue資料型態被定義為char*,其實建議應該定義為void*
另外就是在receive的時候必須先使用mq_getattr取得資料的大小,如果太小將會傳回錯誤,書中的程式figure 5.7就是這麼作,其實我認為應該是使用最大的msg size最為配置大小才不會產生錯誤,因為如果多人同時讀取message queue難保沒有race condition,不然就得加上file lock的機制
message queue跟FIFO一個很大的差異就是優先權以及個數,對FIFO來說,他就是一個stream,可是message是很多個package組成,再者FIFO並沒有優先權的概念,message queue有
另外必須注意到系統message queue的限制,書中提到可以使用sysconf來讀取
後面開始探討message非同步的問題,這就牽涉到system call以及非同步訊號安全函數的使用,等後面有空再寫
沒有留言:
張貼留言