posix訊息佇列

2021-08-20 10:16:21 字數 3968 閱讀 5961

unix兩大貢獻者貝爾實驗室和bsd,在程序之間通訊側重不同,前者基於核心對程序之間的通訊手段進行了改進,形成了「system v ipc」,而後者則是基於網路形成了套接字。

而posix則是ieee制定的標準,目的是為執行在不同作業系統上的軟體提供統一的介面,實現者則是不同的作業系統核心開發人員。

在訊號量這種常用的同步互斥手段方面,posix在無競爭條件下是不會陷入核心的,而system v則是無論何時都要陷入核心,因此效能稍差。

posix訊號量**於posix技術規範的實時擴充套件方案(posix realtime extension),常用於執行緒;system v訊號量,常用於程序的同步。這兩者非常相近,但它們使用的函式呼叫各不相同。前一種的標頭檔案為semaphore.h,函式呼叫為sem_init(),sem_wait(),sem_post(),sem_destory()等等。後一種標頭檔案為,函式呼叫為semctl(),semget(),semop()等函式。

功能:用來建立和訪問乙個訊息佇列

原型:mqd_t mq_open(const cahr *name,int oflag);

mqd_t mq_open(const char *name,int oflag,mode_t mode,struct mq_attr *attr);

引數name:表示訊息佇列的名字,它符合posix ipc的名字規則。

oflag:表示開啟的方式,和open函式的類似。有必須的選項:o_rdonly,o_wronly,o_rdwr,還有可選 項:    o_nonblock,o_creat,o_excl。

attr:也是乙個可選引數,在oflag中含有o_creat標誌且訊息佇列不存在時才需要。該引數用於給新佇列設定某些屬性,如果是空指標,那麼就採用預設屬性。

返回值:

成功返回訊息佇列檔案描述符;失敗返回-1

cd /dev/mqueue

ls說明:

建立成功後在/dev/mqueue目錄下檢視

**

#include #include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

int main(void)

說明:

posix ipc名字有限定,必須以/打頭,並且後續不能有其它/,比如/abc

長度不能超過name_max

功能:關閉訊息佇列

原型:mqd_t mq_close(mqd_t mqdes);

引數mqdes:訊息佇列描述符

返回值:

成功返回0,失敗返回-1

功能:獲取/設定訊息佇列屬性

原型:mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr); 

mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr); 

引數:newattr:要設定的屬性

oldattr:原來的屬性

返回值:

成功返回0,失敗返回-1

說明:

struct mq_attr  

;

**

#include #include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

int main(void)

功能:

傳送訊息

原型:mqd_t mq_send(mqd_t mqdes, const char *msg_ptr,size_t msg_len, unsigned msg_prio);

引數mqdes:訊息佇列描述符

msg_ptr:指向訊息的指標

msg_len:訊息長度

msg_prio:訊息優先順序

返回值:

成功返回0,失敗返回-1

**

typedef struct stu

stu;

int main(int argc,char *argv)

mqd_t mqid;

//開啟乙個訊息佇列

mqid=mq_open("/abc",o_wronly);

if(mqid==(mqd_t)-1)

err_exit("mq_open");

stu stu;

strcpy(stu.name,"test");

stu.age=20;

unsigned prio=atoi(argv[1]);

mq_send(mqid,(const char*)&stu,sizeof(stu),prio);

mq_close(mqid);

return 0;

mq_close(mqid);

return 0;

}

功能:

接收訊息

原型:mqd_t mq_receive(mqd_t mqdes, char *msg_ptr,size_t msg_len, unsigned *msg_prio);  

引數mqdes:訊息佇列描述符

msg_ptr:返回可接受到的訊息的指標

msg_len:訊息長度,要指定訊息的最大值

msg_prio:返回接收到的訊息優先順序

返回值:

成功返回接收到的訊息位元組數,失敗返回-1

注意:返回指定訊息佇列中最高優先順序的最早訊息

**

typedef struct stu

stu;

int main(int argc,char *argv)

功能:

建立或刪除到達通知事件,當訊息佇列從沒有訊息到有訊息,就會通知程序()。 

原型:mqd_t mq_notify(mqd_t mqdes,const struct 

sigevent* notification);

引數:mqdes:訊息佇列描述符

notification:

非空表示當訊息到達且訊息佇列先前為空,那麼將得到通知

null:表示撤銷已註冊的通知

union sigval;  

struct sigevent;

返回值:

成功返回0,失敗返回-1

通知方式:

產生乙個訊號

建立乙個執行緒執行乙個指定的函式

**

#include #include #include #include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

typedef struct stu

stu;

size_t size;

mqd_t mqid;

struct sigevent sigev;

void handle_sigusr1(int sig)

int main(int argc,char *argv)

mq_notify注意

1.任何時刻只能有乙個程序可以被註冊為接收某個給定佇列的通知

2.當有乙個訊息到達某個先前為空的佇列,而且已有乙個程序被註冊為接收該佇列的通知,只有沒有任何執行緒阻塞在該佇列的mq_receive呼叫的前提下,通知才會發出。

3.當通知被傳送到它的註冊程序時,其註冊被撤銷。程序必須再次呼叫mq_notify以重新註冊(如果需要的話),重新註冊要放在訊息佇列讀出資訊之前而不是之後。

POSIX訊息佇列

訊息佇列可認為是乙個訊息鍊錶,有寫許可權的執行緒可以往訊息佇列中寫訊息,有讀許可權的執行緒可以從佇列中讀取訊息,從而實現資料共享。每個訊息都是一條記錄,具有以下屬性 優先順序 無符號整數或長整數型別 訊息的資料部分長度 資料本身。1 相關函式 標頭檔案 include 建立和開啟 mqd t mq ...

Posix訊息佇列

posix訊息佇列與system v訊息佇列的主要差別 1 對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列的讀則可以返回任意指定優先順序的訊息 2 當往乙個空佇列放置乙個訊息時,posix訊息佇列允許產生乙個訊號或啟動乙個執行緒,system v訊息佇列則不提供類...

posix 訊息佇列

posix 訊息佇列 訊息佇列的使用 1.建立訊息佇列mq open const char name,int oflag,mode t mode,struct mq attr attr name 訊息佇列的名稱,以 開頭 oflag 標誌,o rdonly 唯讀 o wronly 只寫 o rdwr...