Linux程序間利用訊息佇列傳送資料

2021-10-20 15:21:03 字數 1548 閱讀 9855

訊息佇列是linux系統程序之間通訊一種方式,除此之外,程序通訊方式還有多種。本文僅討論訊息佇列通訊方式。訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

訊息佇列函式由msgget、msgctl、msgsnd、msgrcv四個函式組成。

下面是實際**案例,相關的函式我會在**下進行解釋,適合小白**,大神勿噴;

#include #include #include #include #include #include #define max_text 512

struct msg_st;

int main(int argc, char **ar**)

// 向訊息隊裡中寫訊息,直到寫入end

while (1)

// 輸入end結束輸入

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

sleep(1);

}exit(exit_success);

}

分享一下我第一次看此**不懂並且查詢資料後的成果:

msgid = msgget((key_t)1234, 0666 | ipc_creat);
根據上文鏈結中的理論可知,(key_t)1234是將1234型別強轉為key_t型,並且0666的相關含義查詢資料後得知:從左向右:

第一位:表示這是個八進位制數 000

第二位:當前使用者的經許可權:6=110(二進位制),每一位分別對就 可讀,可寫,可執行,6說明當前使用者可讀可寫不可執行

第三位:group組使用者,6的意義同上

第四位:其它使用者,每一位的意義同上,0表示不可讀不可寫也不可執行

fgets(buffer, bufsiz, stdin);
參考網上的**可以對此函式有更好的理解

# include int main(void)

最後就是最重要的msgsnd函式本體了

msgsnd(msgid, (void *)&data, max_text, 0) ;

參照上述鏈結中理論可以很輕鬆看懂,此函式的實參和理論中的形參一一對應即可,不再贅述;

然後是接收端**

#include #include #include #include #include struct msg_st; 

int main(int argc, char **ar**)

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

while (1)

printf("you wrote: %s\n", data.text);

// 遇到end結束

if (strncmp(data.text, "end", 3) == 0)

}// 刪除訊息佇列

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

exit(exit_success);

}

Linux程序間通訊 訊息佇列

linux和類linux系統下程序間通訊 inter process communication,ipc 有很多種方式,包括套接字 socket 共享記憶體 shared memory 管道 pipe 訊息佇列 message queue 等,各自有各自的一些應用場景和用途,這次就來聊一聊訊息佇列這...

linux程序間通訊 訊息佇列

訊息佇列由id 唯一標識 訊息佇列就是乙個訊息的列表,使用者可在佇列中新增,讀取訊息等 可按照型別來收發訊息 int msgget key t key,int flag int msgsnd int msqid,const void msgp,size t size,int flag msqid 訊...

Linux程序間通訊 訊息佇列

首先上篇文章我們說到了linux下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...