簡易聊天 訊息佇列實現程序間通訊

2021-08-13 05:47:22 字數 2580 閱讀 9002

為什麼這個不是極簡版聊天了呢?因為它加強了,不像管道實現的聊天,只能乙個人說話,而另乙個人只能靜靜地看著。而訊息佇列實現的可以兩個人正常交流。

在此之前,我們先來了解一下訊息佇列:

*unix早期通訊機制之一的訊號能夠傳送的資訊量有限,管道則只能傳送無格式的位元組流,這無疑會給應用程式開發帶來不便。訊息佇列(也叫做報文佇列)則克服了這些缺點。

*訊息佇列就是乙個訊息的鍊錶.可以把訊息看作乙個記錄,具有特定的格式.程序可以向中按照一定的規則新增新訊息;另一些程序則可以從訊息佇列中讀走訊息

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

鍵值

key_t ftok (char*pathname, char proj)

功能: 返回檔名對應的鍵值。

pathname: 檔名

proj: 專案名(不為0即可)

開啟/建立

int msgget(key_t key, int msg***)

key:鍵值,由ftok獲得。

msg***:標誌位。

返回值:與健值key相對應的訊息佇列描述字

ipc_creat

建立新的訊息佇列

ipc_excl

與ipc_creat一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤。

ipc_nowait

讀寫訊息佇列要求無法得到滿足時,不阻塞

與fifo的區別

在極簡聊天中,只需要乙個人進行寫操作,另乙個人進行讀操作,所以只需要定義乙個buf陣列就好了,但是這次是要實現雙方都能進行讀寫,而我們使用程序(暫時不涉及執行緒),乙個程序只能幹一件事(讀或寫),目前有兩個.c檔案(即兩個程序),所以需要使用fork來建立程序,是每個程序程式中有兩個程序。那麼,就必須設定好這四個程序哪兩個寫,哪兩個讀,為了讓乙個程序寫的內容保證讓另乙個程序讀到,就需要在它倆之間建立乙個「暗號」,就是訊息型別,所以陣列顯然不可取了,我們得用結構體。

訊息格式:

struct msgbuf

下面開始實現:

massagequeue1.c

#include 

#include

#include

#include

#include

#include

#include

#define msgkey 1234 //鍵值

struct msgbuf

;int main()

pid = fork(); //建立子程序,注意必須在建立訊息佇列之後

if (-1 == pid) //建立失敗返回-1

else

if (0 == pid) //pid為0,則進入子程序

if (!strncmp(buf.mtext, "bye", 3)) //以bye結束

break;

} }}

else

//否則,進入父程序

if (!strncmp(buf.mtext, "bye", 3)) //以bye結束

printf("receive : %s\n", buf.mtext); //把收到的訊息列印

}waitpid(pid, null, 0); //父程序等待

}msgctl(msgid, ipc_rmid, null); //銷毀訊息佇列

return

0;}

massagequeue2.c

#include 

#include

#include

#include

#include

#include

#include

#define msgkey 1234

struct msgbuf

;int main()

pid = fork(); //建立子程序

if (-1 == pid)

else

if (0 == pid) //子程序執行部分

if (!strncmp(buf.mtext, "bye", 3)) //以bye結束

break;}}

}else

//父程序執行部分

if (!strncmp(buf.mtext, "bye", 3)) //以bye結束

printf("receive : %s\n", buf.mtext); //列印收到的訊息

}waitpid(pid, null, 0); //等待子程序

return

0; }

}

第乙個程式中的子程序傳送訊息,第二個程式中的父程序接收訊息

第二個程式中的子程序傳送訊息,第乙個程式中的父程序接收訊息

執行結果:

程序間訊息佇列通訊

要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...

程序間通訊(訊息佇列)

在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...

程序間通訊 訊息佇列

有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...