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