程序通訊 訊息佇列 管道通訊)

2021-08-24 17:33:48 字數 2188 閱讀 8029

推薦一篇介紹程序通訊的概論:(

推薦閱讀(

訊息佇列的建立與讀寫ftok,msgget,msgsnd,msgrcv,指令ipcs,ipcrm 檢視,刪除佇列

訊息佇列函式(msgget、msgctl、msgsnd、msgrcv)及其範例

訊息佇列是存放在核心中的訊息鍊錶,每個訊息佇列由訊息佇列識別符號表示。對於系統中的每個訊息佇列,核心維護乙個定義在sys/msg.h標頭檔案中的資訊結構:

struct msqid_ds ;

訊息佇列中的幾個重要函式:

1、int msgget (key_t key, int oflag);

返回值是乙個整數識別符號,其他三個msg函式就用它來指代該佇列。它是基於指定的key產生的,而key既可以是ftok的返回值,也可以是常值ipc_private。

oflag是讀寫許可權的組合(用於開啟時)。它還可以是ipc_create或ipc_create | ipc_excl(用於建立時)。

2、*int msgsnd (int msqid, const void ptr, size_t length, int flag)

;其中msqid是由msgget返回的識別符號。ptr是乙個結構指標,該結構具有如下模板(我們需要按這個模板自己定義結構體)

3、size_t msgrcv (int msqid, void ptr, size_t length, long type, int flag) ;*

引數ptr指定所接收訊息的存放位置。引數length指定了資料部分大小(只想要多長的資料)

引數type指定希望從佇列中讀出什麼樣的訊息。

type == 0 返回佇列中的第乙個訊息

type > 0 返回佇列中訊息型別為type的第乙個訊息

type < 0 返回佇列中訊息型別值小於或等於type絕對值的訊息,如果這種訊息有若干個。則取型別值最小的訊息。

(如果乙個訊息佇列由多個客戶程序和乙個伺服器程序使用,那麼type欄位可以用來包含客戶程序的程序id)

引數flag可以指定為ipc_nowait,使操作不阻塞。

4、int msgctl (int msqid, in cmd, struct msqid_ds * buff) ;

引數cmd說明對由msqid指定的佇列要執行的命令:

ipc_stat :取此佇列的msqid_ds結構,並將它存放在buf指向的結構中。

ipc_set :按由buf指向結構中的值,設定與此佇列相關結構中的字段。

ipc_rmid:從系統中刪除該訊息佇列以及仍在該佇列中的所有資料。

(這三條命令也可用於訊號量和共享儲存)

c實現如下:

#include #include #include //包含ftok()

#include #include #include #include#include#define buf_size 128

struct mymsg ;

void send_msg(int msgid,struct mymsg msgbuf);

void receive_msg(int msgid,struct mymsg *qbuf,long type);

void del_msg(int msgid);

int get_key()

int getid()

int main()

int msgid=getid();

if(msgid<0) printf("get msg success\n");

while(1)

del_msg(msgid);

}void send_msg(int msgid,struct mymsg msgbuf)

printf("send msg success\n");

} void receive_msg(int msgid,struct mymsg *qbuf,long type)

else

printf("type:%ld,text:%s\n",qbuf->mtype,qbuf->mtext);

} void del_msg(int msgid)

}

注:以上**只是訊息佇列功能的演示,並沒有實現多程序功能,只需將傳送和接收部分放到不同程序即可。

推薦閱讀管道通訊的詳細解釋(

程序通訊(訊息佇列)

訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊息佇列與命名管道有一 樣的不足,就是每個訊息的最大長度是有上限的 msgmax 每個訊息佇列的總的位元組 數是有上限的 msgmnb 系統上訊息佇列的總數也有乙個上限 msgmni ipc物件資...

程序通訊 訊息佇列

訊息佇列的使用 建立開啟訊息佇列msgget 讀資料從佇列msgrcv 寫資料到佇列msgsnd 控制訊息佇列msgctl 目前主要有兩種型別的訊息佇列 posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用 訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得...

Linux程序通訊 訊息佇列

1.訊息佇列 訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除 系統中記錄訊息佇列的資料結構struct ipc ids msg ids位於核心中,系統中所有訊息佇列都可以在結構msg ids中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...