前段時間學習執行緒讀寫鎖,找資料就找到了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...