Linux C 訊息佇列實現簡單的聊天功能

2021-08-21 21:13:10 字數 2584 閱讀 9244

訊息佇列是提供一種帶有資料標識的特殊管道,使得每一段被寫入的資料都變成帶標識的訊息,讀取該段訊息的程序只要指定這個標識就可以正確地讀取,而不會受到其他訊息的干擾,。乙個帶標識的訊息佇列,就像並存的管道一樣。這裡主要介紹的是利用執行緒和訊息佇列,寫兩個程序,實現兩個程序之間的聊天功能。

使用方法:

傳送者:首先要獲取訊息佇列的id號,然後將資料放入乙個帶有標識的結構體內,最後把訊息傳送到訊息佇列中。

接收者:首先也是要獲取到訊息佇列的id號,然後把帶有指定標識的資料讀出來。

所需要用到的函式有:

#include

#include

key_t ftok(const char *pathname, int proj_id);    第乙個引數是乙個已存在的路徑,第二個引數可以自定義。只要兩個程序中的兩個引數是相同的,那麼生成的key值也是相同的。

include

#include

#include

返回值:成功則返回合法的key值;失敗返回-1。

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

第乙個引數就是通過ftok函式生成的key值,第二個引數:

ipc_creat 如果在核心中不存在該佇列,則建立它。 ipc_excl 當與ipc_creat一起使用時,如果佇列早已存在則將出錯。同時可以指定msg的訪問許可權,如(0666);

返回值:成功則返回訊息佇列的id,失敗就返回-1;

如msgget(key,ipc_create | 0666 )就表示,如果key值對應的訊息佇列不存在就建立,存在就獲取訊息佇列的id。許可權只有讀寫,所以0777和0666是一樣的。沒有執行的許可權。

傳送和接收函式:

#include

#include

#include

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msg***);

msgsnd();第乙個引數為訊息佇列的id號;第二個引數為要傳送資料的儲存區指標。

第三個引數為要接收資料的大小。

最有乙個引數:msg***

msg_noerror    若返回的訊息比msgsz位元組多,則訊息會截斷到msgsz位元組,且不通知訊息傳送程序

ipc_nowait 若訊息佇列中無對應型別的訊息接收則立即返回

阻塞等待直至接收到一條相應型別的訊息為止

一般都寫0,阻塞等待。

msgrcv()函式與magsnd()函式的引數相同,除了mystype。這個是接收函式獨有的。代表要接收訊息的標識。

傳送訊息的時候,訊息必須要被組織為以下的形態:

struct massage

;傳送的訊息必須要有乙個標識在前面,後面的資料則沒有要求。

msgctl()

#include

#include

#include

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

第乙個引數為訊息佇列的id;

第二個引數:

ipc_stat:把msgid_ds結構中的資料設定為訊息佇列的當前關聯值,即用訊息佇列的當前關聯值覆蓋msgid_ds的值。

ipc_set:如果程序有足夠的許可權,就把訊息列隊的當前關聯值設定為msgid_ds結構中給出的值

ipc_rmid:刪除訊息佇列

ipc_info:獲得當前系統中msg的限制值資訊

msg_info:獲得當前系統中msg的相關資源消耗的資訊

msg_stat:獲取系統中所有訊息佇列的資訊。

最後乙個引數為相關結構體快取區。

具體**如下。需要注意的是,傳送資料的函式需要寫在主線程中,接收函式寫在建立執行緒中,這樣才能做到隨時進行資料的傳輸。分別編譯a.c和b.c,然後同時執行兩個可執行檔案就可以了。編譯時記得鏈結執行緒庫。兩個程式的主要區別就在於接收和傳送的資訊標識。

a.c

#include#include #include #include #include#include#include struct massage

;struct massage buf;

int msgid;

void *recive(void *p)

return 0;

}int main()

msgctl(msgid, ipc_rmid, 0);

return 0;

}b.c

#include#include #include #include #include#include#include struct massage

;struct massage buf;

int msgid;

void *recive(void *p)

return 0;

}int main()

msgctl(msgid, ipc_rmid, 0);

return 0;

}

Linux C程式設計 訊息佇列實現同時通訊

訊息佇列實現同時通訊 unix早期通訊機制之一的訊號能夠傳送的資訊量有限,管道則只能傳送無格式的位元組流,這無疑會給應用程式開發帶來不便。訊息佇列 也叫做報文佇列 則克服了這些缺點。訊息佇列就是乙個訊息的鍊錶.可以把訊息看作乙個記錄,具有特定的格式.程序可以向中按照一定的規則新增新訊息 另一些程序則...

php redis實現簡單的訊息佇列

redis redis是乙個開源,高階的鍵值儲存和乙個適用的解決方案,用於構建高效能,可擴充套件的web應用程式。redis有三個主要特點,使它優越於其它鍵值資料儲存系統 redis支援的資料型別有 stirng 字串 list 列表 hash 字典 set 集合 sorted set 有序集合 r...

linux c 迴圈訊息佇列寫法

很多場合,我們需要乙個迴圈訊息處理模式,乙個執行緒產生訊息,乙個執行緒進行處理。產生訊息的執行緒就不用阻塞了,可以用了幹其他的事情了。常見串列埠或者網路通訊,負責解析位元組流的執行緒將訊息初步解析然後放置到乙個訊息佇列裡面,處理執行緒負責迴圈取出訊息佇列裡面的訊息進行相應的動作。下面是一在liunx...