Posix消息隊列相關函數
阿新 • • 發佈:2018-09-25
其中 signed 相同 function size 隊列 only 常用 對象
o_RDONLY 只讀
O_WRONLY 只寫
O_RDWD 讀寫
O_CREAT 若不存在則創建,存在則引用
O_EXCL 排他性創建,需要和O_CREAT一起使用,當對象不存在時才創建,否則返回EEXIST錯誤
O_NONBLOCK 非阻塞模式
O_TRUNC 若已存在則截短
S_IWUSR 用戶(屬主)寫
S_IRGRP 屬組讀
S_IWGRP 屬組寫
S_IROTH 其他用戶讀
S_IWOTH 其他用戶寫
Posix消息隊列(message queue)
IPC函數中常用的參數取值:
打開或創建POSIX IPC對象所用的各種oflag常值o_RDONLY 只讀
O_WRONLY 只寫
O_RDWD 讀寫
O_CREAT 若不存在則創建,存在則引用
O_EXCL 排他性創建,需要和O_CREAT一起使用,當對象不存在時才創建,否則返回EEXIST錯誤
O_NONBLOCK 非阻塞模式
O_TRUNC 若已存在則截短
創建新的IPC對象所用的mode常值:
S_IRUSR 用戶(屬主)讀S_IWUSR 用戶(屬主)寫
S_IRGRP 屬組讀
S_IWGRP 屬組寫
S_IROTH 其他用戶讀
S_IWOTH 其他用戶寫
mq_open()函數:
#include <mqueue.h> // 創建一個新的消息隊列,或打開一個已存在的消息隊列 // 成功返回消息隊列描述符,出錯 返回-1 mqd_t mq_open(const char *name, int oflag, ... /* mode_t mode, struct mq_attr *attr */); // name:Posix IPC名字(標識符) // oflag取值: o_RDONLY、O_WRONLY、O_RDWD,可能按位或上O_CREAT、O_EXCL、O_NONBLOCK // attr: 消息隊列的屬性(可以不指定此參數)
mq_close()函數:
#include <mqueue.h> // 關閉一個打開著的消息隊列,但不從系統中將其刪除,成功返回0,出錯返回-1 int mq_close(mqd_t mqdes);
mq_unlink()函數:
#include <mqueue.h> // 從系統中刪除一個消息隊列,成功返回0,出錯返回-1 int mq_unlink(const char *pathname);
註意:
大家可能在close和unlink之間存在疑惑,而除了此處的close和unlink,還有對文件的close和unlink
面對不同對象的close和unlink,表示的含義其實是相同的,close(關閉)即關閉open打開的對某個對
象的訪問通道,而對於對象本身存在與否(創建/刪除)沒有影響,而unlink影響的是某個對象是否存在
一旦對某個對象的鏈接數(link)為0,且該對象沒有被open,則該對象就會被徹底刪除
上述的對象(File、Message Queue...等)
消息隊列的屬性:
struct mq_attr{ long mq_flags; // 消息隊列的標誌 long mq_maxmsg; // 隊列允許的最大消息數量 long mq_msgsize; // 消息的最大長度(bytes) long mq_curmsgs; // 此時存在與隊列中的消息數量 };
mq_getattr()和mq_setattr()函數:
#include <mqueue.h> // 成功返回0,出錯返回-1 // 將當前消息隊列的屬性填入參數attr指向的結構中 int mq_getattr(mqd_t mqdes, struct mq_attr *attr); // 給指定隊列設置屬性(attr,但只使用attr的attr.mq_flags成員),當oattr非空時,將指定隊列的先前屬性填入其中 int mq_setattr(mqd_t mqdes, const struct mq_attr *attr, struct mq_attr *oattr);
mq_send()和mq_receive()函數:
#include <mqueue.h> // 成功返回0,出錯返回-1 // 往消息隊列中放置一個消息 int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio); // prio: 待發消息的優先級 // 成功返回消息的字節數,出錯返回-1 // 從消息隊列取出一個消息 ssize_t mq_receive(mqd_t mqdes, const char *ptr, size_t len, unsigned int *priop); // 這裏的len參數值不能小於能添加到指定隊列中消息的最大大小(mq_attr.mq_msgsize)
mq_notify()函數:
#include <mqueue.h> // 成功返回0,出錯返回-1 // 指定隊列建立或刪除異步事件通知 int mq_notify(mqd_t mqdes, const struct sigevent *notification);
相關結構:
union sigval{ int sival_int; void *sival_ptr; }; struct sigevent{ int sigev_notify; int sigev_signo; union sigval sigev_value; void (*sigev_notify_function)(union sigval); pthread_attr_t *sigev_notify_attributes; };
Posix消息隊列相關函數