IPC通訊 Posix訊息佇列的建立,關閉,刪除

2021-09-08 16:07:52 字數 2123 閱讀 6432

訊息佇列可以認為是乙個鍊錶。程序(執行緒)可以往裡寫訊息,也可以從裡面取出訊息。乙個程序可以往某個訊息佇列裡寫訊息,然後終止,另乙個程序隨時可以從訊息佇列裡取走這些訊息。這裡也說明了,訊息佇列具有隨核心的持續性,也就是系統不重啟,訊息佇列永久存在。

建立(並開啟)、關閉、刪除乙個訊息佇列

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

2 /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 下的訊息隊列為例來進行講解。訊息佇列的建立 訊息佇列的...