linux下的程序間通訊之訊息佇列

2022-05-08 11:24:10 字數 1803 閱讀 2205

概念: 程序彼此之間可以通過ipc訊息進行通訊。程序產生的每條訊息都被傳送到乙個ipc訊息佇列中,這條訊息一直存放在佇列中,直到另乙個程序將其讀走為止。

優點:可以通過傳送訊息來幾乎完全避免命名管道的同步和阻塞問題;訊息佇列提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。而且,每個資料塊被認為含有乙個型別,接收程序可以獨立地接收含有不同型別值的資料塊。

缺點:每個資料塊有乙個最大長度的限制;系統中所有訊息佇列所包含的全部資料塊的總長度也有乙個上限。

基本原理: 訊息是由固定大小的首部和可變長度的正文組成的;可以使用乙個整數值標識訊息,這就允許程序有選擇的從訊息佇列中獲取訊息。只要程序從ipc訊息佇列中讀出一條訊息,核心就把這條訊息刪除;因此,乙個程序只能接收一條給定的訊息。當訊息佇列滿時,則試圖讓新訊息入隊的程序可能被阻塞。當訊息隊列為空時,則接收程序甚至會被阻塞。

**示例

傳送資訊的程式的原始檔msgsend.c的源**為:

#include #include 

#include

#include

#include

#include

#define max_text 512

struct

msg_st;

intmain()

//向訊息佇列中寫訊息,直到寫入end

while

(running)

//輸入end結束輸入

if(strncmp(buffer, "

end", 3) == 0

) running = 0

; sleep(1);

}exit(exit_success);

}

接收資訊的程式原始檔為msgreceive.c的源**為:

#include #include 

#include

#include

#include

#include

struct

msg_st;

intmain()

//從佇列中獲取訊息,直到遇到end訊息為止

while

(running)

printf(

"you wrote: %s\n

",data.text);

//遇到end結束

if(strncmp(data.text, "

end", 3) == 0

) running = 0

; }

//刪除訊息佇列

if(msgctl(msgid, ipc_rmid, 0) == -1

)

exit(exit_success);

}

如果把注意1,即msgreceive.c檔案main函式中的語句由long int msgtype = 0;改變為long int msgtype = 2;會發生什麼情況,msgreceive將不能接收到程式msgsend傳送的資訊。因為在呼叫msgrcv函式時,如果msgtype(第四個引數)大於零,則將只獲取具有相同訊息型別的第乙個訊息,修改後獲取的訊息型別為2,而msgsend傳送的訊息型別為1,所以不能被msgreceive程式接收。

msgreceive如果沒有接收到資訊和輸出,而且當msgsend輸入end結束後,msgreceive也不會結束,通過jobs命令我們可以看到它還在後台執行著。

linux程序間通訊之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。include include include include include include in...

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...

linux程序間通訊之訊息傳遞

linux 程序間通訊中訊息傳遞主要分為管道,fifo,訊息佇列 1 管道 管道由pipe函式建立,提供乙個單路 單向 資料流。pipe函式返回兩個檔案描述符 fd 0 和fd 1 前者開啟來讀,後者開啟來寫。管道沒有名字,所以只能由有親緣關係的程序使用。儘管管道是由單個程序建立的,它卻很少在單個程...