1. 程式人生 > >Posix消息隊列相關函數

Posix消息隊列相關函數

其中 signed 相同 function size 隊列 only 常用 對象

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消息隊列相關函數