訊息佇列可以認為是乙個鍊錶。程序(執行緒)可以往裡寫訊息,也可以從裡面取出訊息。乙個程序可以往某個訊息佇列裡寫訊息,然後終止,另乙個程序隨時可以從訊息佇列裡取走這些訊息。這裡也說明了,訊息佇列具有隨核心的持續性,也就是系統不重啟,訊息佇列永久存在。
建立(並開啟)、關閉、刪除乙個訊息佇列
1 #include 2 #include 3 #include //標頭檔案4 #include 5 #include 6 #include 7 #include 8 #include 9
10#define mq_name ("/tmp")
11#define mq_flag (o_rdwr | o_creat | o_excl) //
建立mq的flag
12#define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth) //
設定建立mq的許可權
1314
intmain()
1516
3132/*
33函式說明:關閉乙個開啟的訊息佇列,表示本程序不再對該訊息佇列讀寫
34返回值:成功返回0,失敗返回-1,錯誤原因存於errno中
35*/
36 rc =mq_close(posixmq);
37if(0 !=rc)
38
4243
/*44
函式說明:刪除乙個訊息佇列,好比刪除乙個檔案,其他程序再也無法訪問
45返回值:成功返回0,失敗返回-1,錯誤原因存於errno中
46*/
47 rc =mq_unlink(mq_name);
48if(0 !=rc)
49
5354
return
0;
55 }
編譯並執行:
1 root@linux:/mnt/hgfs/c_libary# gcc -o crtmq crtmq.c2 /tmp/ccz9ctxo.o: in function `main'
:3 crtmq.c:(.text+0x31): undefined reference to `mq_open'
4 crtmq.c:(.text+0x60): undefined reference to `mq_close'
5 crtmq.c:(.text+0x8f): undefined reference to `mq_unlink'
6 collect2: ld returned 1
exit status
7 因為mq_***()函式不是標準庫函式,鏈結時需要指定;庫-lrt;
8 root@linux:/mnt/hgfs/c_libary# gcc -o crtmq crtmq.c -lrt
910 root@linux:/mnt/hgfs/c_libary# ./crtmq
11最後程式並沒有刪除訊息佇列(訊息佇列有隨核心持續性),如再次執行該程式則會給出錯誤資訊:
12 root@linux:/mnt/hgfs/c_libary# ./crtmq
13 建立mq失敗: file exit(0)
編譯這個程式需要注意幾點:
1、訊息佇列的名字最好使用「/」打頭,並且只有乙個「/」的名字。否則可能出現移植性問題;(還需保證在根目錄有寫許可權,為了方便我在root許可權下測試)
2、建立成功的訊息佇列不一定能看到,使用一些方法也可以看到,本文不做介紹;
訊息佇列的名字有如此規定,引用《unix網路程式設計 卷2》的相關描述: mq_open,sem_open,shm_open這三個函式的第乙個引數是
乙個ipc名字,它可能是某個檔案系統中的乙個真正存在的路徑名,也可能不是。posix.1是這樣描述posix ipc名字的。
1)它必須符合已有的路徑名規則(最多由path_max個位元組構成,包括結尾的空位元組)
2)如果它以斜槓開頭,那麼對這些函式的不同呼叫將訪問同乙個佇列,否則效果取決於實現(也就是效果沒有標準化)
3)名字中的額外的斜槓符的解釋由實現定義(同樣是沒有標準化) 因此,為便於移植起見,posix ipc名字必須以乙個斜槓打頭,並且不能再包含任何其他斜槓符。
IPC通訊 Posix訊息佇列的屬性設定
posix訊息佇列的屬性使用如下結構存放 struct mq attr 佇列可以在建立時由mq open 函式的第四個引數指定mq maxmsg,mq msgsize。如建立時沒有指定則使用預設值,一旦建立,則不可再改變。佇列可以在建立後由mq setattr 函式設定mq flags includ...
程序間通訊 posix 訊息佇列
posix訊息佇列 訊息佇列可以認為是乙個訊息鍊錶,某個程序往乙個訊息佇列中寫入訊息之前,不需要另外某個程序在該佇列上等待訊息的達到,這一點與管道和fifo相反。posix訊息佇列與system v訊息佇列的區別如下 對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列...
程序間通訊 IPC 訊息佇列
訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號標識。有足夠寫許可權的程序可往佇列中放置訊息,有足夠讀許可權的程序可從佇列中取走訊息。posix 和 system v 下的訊息佇列略有不同,主要體現在一下幾個方面 這裡我們以 posix 下的訊息隊列為例來進行講解。訊息佇列的建立 訊息佇列的...