Linux程序間的通訊方式 訊息佇列

2021-07-24 04:22:31 字數 3173 閱讀 9670

1. 訊息佇列就是乙個訊息的鍊錶。可以把訊息看做乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新資訊,對訊息佇列有讀許可權的程序可以從訊息佇列中讀走訊息,訊息佇列是隨核心持續的。每個訊息佇列都有乙個佇列頭,用結構struct msg_queue來描述。佇列頭中包含了該訊息佇列的大量資訊,包括訊息佇列鍵值,使用者id,組id,訊息佇列中訊息數目等,甚至記錄了最近對訊息佇列讀寫程序的id。讀者可以訪問這些資訊,也可以設定其中的某些資訊。

2. 全域性資料結構struct ipc_ids msg_ids可以訪問到每個訊息佇列頭的第乙個成員struct kern_ipc_perm能夠與具體的訊息佇列對應起來是因為在該結構中,有乙個key_t型別成員key,而key則確定乙個訊息佇列。

3. 訊息佇列的操作有以下三種型別

a. 開啟或者建立訊息佇列

b. 讀寫操作

c. 獲得或者設定訊息佇列屬性

4.鍵值的概念:訊息佇列的核心持續性要求每個訊息佇列在系統範圍內都有對應的唯一的鍵值,要獲得乙個訊息佇列的描述字,必須提供該訊息佇列的鍵值

5.ftok函式:

作用:將檔名轉化為鍵值

函式原型:key_t fotk(char *pathname ,char proj)

返回值:返回與檔案對應的鍵值

6.msgget函式

作用:建立訊息佇列

原型:int msgget(key_t key,int msg***)

引數:鍵值和許可權,是可讀還是可寫,ipc_private,設定乙個數字,也可以由tok函式獲得

msg***:ipc_creat:無訊息佇列時建立訊息佇列

ipc_excl:只有在訊息佇列不存在時建立訊息佇列,否則報錯

ipc_nowait:讀寫訊息佇列無法得到滿足時不等待,之間返

返回值:執行成功時,返回與鍵值

key對應的訊息佇列描述字;執行出錯,返回-1

7.msgrcv函式

函式的原型:int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msg***);

標頭檔案:#include

#include

#include

引數:msqid:訊息佇列的id(描述字)

msgp:訊息讀取後存放的記憶體空間首位址,是訊息結構型別的指標

msgsz:訊息資料的長度

msgtyp:請求讀取的訊息型別(正整數)

msg***:接收標誌

ipc_nowait:讀不到資料時直接返回,不等待

0:一直等待到成功讀取資料

返回值:執行成功,返回0;執行出錯,返回-1

8.msgsnd函式

函式的原型:int msgsnd(int msqid, struct msgbuf *msgp, int msgsz,int msg***);

標頭檔案:

#include

#include

#include

引數:① msqid:已開啟的訊息佇列id(描述字)

② msgp:指向訊息結構的指標,結構如下:

struct msgbuf ;

③ msgsz:訊息資料的長度

④ msg***:傳送標誌

ipc_nowait:寫不進資料時直接返回,不等待

0:一直等待到成功寫入資料

返回值:執行成功,返回0;執行出錯,返回-1

(4)控制訊息佇列

通常在使用完訊息佇列後用msgctl函式刪除訊息佇列

函式的原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf);

標頭檔案:

#include

#include

#include

引數:① msqid:訊息佇列的id(描述字)

② cmd:相應的命令

ipc_stat:獲取訊息佇列資訊,返回資訊存在buf指向的msqid結構中

ipc_set:設定訊息佇列的屬性

ipc_rmid:刪除訊息佇列

③ buf:訊息佇列的結構型別變數

返回值:執行成功,返回0;執行出錯,返回-1

例: 讀取函式:

[plain]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

struct my_msg_st    

;    

int main(void)    

/*迴圈從訊息佇列中接收訊息*/    

while(running)    

printf("you wrote: %s",some_data.some_text);    

/*接收到的訊息為「end」時結束迴圈*/    

if(strncmp(some_data.some_text,"end",3)==0)    

}    

/*從系統核心中移走訊息佇列*/    

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

exit(exit_success);    

}  

傳送函式:

[plain]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define max_text 512    

struct my_msg_st    

;    

int main(void)    

/*迴圈向訊息佇列中新增訊息*/    

while(running)    

/*使用者輸入的為「end」時結束迴圈*/    

if(strncmp(buffer,"end",3)==0)    

}    

exit(exit_success);    

}  

訊息佇列 程序間通訊方式

一 概念 訊息佇列是由存放在核心中由訊息組成的鍊錶,由ipc id標識。使用者可以在訊息佇列中新增和讀取訊息。特點 1.訊息佇列提供的是一種帶有資料標識的特殊管道,因此可以選擇性的讀取資訊 2.如果訊息佇列中有多條型別一樣的訊息,接收的時候只能按照先後順序接收 佇列特點 3.如果你接收的訊息型別不存...

linux 程序間通訊方式

1 無名管道通訊 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 高階管道通訊 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式...

Linux程序間通訊方式

目錄前言 一 程序間通訊的目的 二 linux程序間通訊方式簡介 程序間的通訊就是在不同程序之間傳播或者交換資訊。程序的使用者空間是相互獨顯然可以體用這幾樣的立的,一般而言是不能互相訪問的,唯一的例外是共享空間。但是系統空間卻是 公共場所 所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪...