linux下Posix訊息佇列的建立和刪除

2021-07-24 15:56:03 字數 3582 閱讀 4927

前段時間學習執行緒讀寫鎖,找資料就找到了stevens老爺子的unp2,雖然對unp2 仰慕已久,始終沒有買來一讀,總是看電子書。本週買了本unp2 ipc,開始看下。

對system v的訊息佇列,有一定的了解,但是對於posix的訊息佇列,並不熟悉。所以看了書的第五章,補習一下。看書看的很快,覺得自己都掌握了,可是今天照抄了書上的一段程式,愣是看不到生成的訊息佇列在**。上網上找了資料,解決了這個問題。

正所謂 紙上得來終覺淺,絕知此事要躬行。記錄下來,讓後來者少走彎路,也防止自己忘記。

man mq_overviwe 可以看到,linux對posix訊息佇列的支援是有自己特點的。linux下posix 訊息佇列是建在vfs下的。英文好的同學可以閱讀下。

要想看到建立的posix訊息佇列,需要執行以下操作:

# mkdir /dev/mqueue

# mount -t mqueue none /dev/mqueue

ok,我們可以看下我們建立刪除的posix訊息佇列函式,以及效果。基本是照抄的unp2的,版權歸stevens老爺子.

#include

#include

#include

#include

#include

#include

int main(

int argc,char *argv)

}if(optind!=argc-1)

mqd = mq_open(argv[optind]

,flags,s_irusr|s_iwusr,

null);

if(mqd =

=-1)

mq_close(mqd)

;return 0;}

#include

#include

#include

#include

#include

int main(

int argc,char *

*argv)

int ret = mq_unlink(argv[1]);

if(ret !

= 0)

return 0;}

注意編譯的時候,一定要加 -lrt選項,否則會報錯。

執行之前,先看下/dev/mqueue

root@libin:

~/program/c/ipc# ll /dev/mqueue/

總用量 0

drwxrwxrwt 2 root root 40 2011-12-03 23:42 .

/drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../

執行./mqcreate /abcd,然後再次檢視/dev/mqueue

root@libin:

~/program/c/ipc# .

/mqcreate /abcd

root@libin:

~/program/c/ipc# ll /dev/mqueue/

總用量 0

drwxrwxrwt 2 root root 60 2011-12-03 16:01 .

/drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../

-rw---

---- 1 root root 80 2011-12-03 16:01 abcd

我們傳入乙個名字,然後生成訊息佇列,注意這個名字是有要求的。

1 / 打頭

root@libin:

~/program/c/ipc# .

/mqcreate ab/cd

mq_open failed 22-

>invalid argument

2 有且只有乙個/,

root@libin:

~/program/c/ipc# .

/mqcreate /a/b

mq_open failed 13-

>permission denie

3 檔名盡量不要太長吧。因為有長度限制。這個到底支援多長我沒有測試出來,

因為網上有人說不要超過14位元組,但是我測試的結果,是允許超過14位元組的。

libin@libin:~$ ll /dev/mqueue/

總用量 0

drwxrwxrwt 2 root root 200 2011-12-03 16:22 ./

drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../

-rw------- 1 root root 80 2011-12-03 16:01 abcd

-rw------- 1 root root 80 2011-12-03 16:20 abcdefghijklmn

-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmno

-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop

-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq

-rw------- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd

-rw------- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst

-rw------- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz

最後執行下刪除:

root@libin:

~/program/c/ipc# .

/mqunlink /abcd

root@libin:

~/program/c/ipc# ll /dev/mqueue/

總用量 0

drwxrwxrwt 2 root root 180 2011-12-03 16:31 .

/drwxr-xr-x 18 root root 3860 2011-12-03 16:00 ../

-rw---

---- 1 root root 80 2011-12-03 16:20 abcdefghijklmn

-rw---

---- 1 root root 80 2011-12-03 16:08 abcdefghijklmno

-rw---

---- 1 root root 80 2011-12-03 16:08 abcdefghijklmnop

-rw---

---- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopq

-rw---

---- 1 root root 80 2011-12-03 16:22 abcdefghijklmnopqd

-rw---

---- 1 root root 80 2011-12-03 16:08 abcdefghijklmnopqrst

-rw---

---- 1 root root 80 2011-12-03 16:09 abcdefghijklmnopqrstuvwxyz

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...