1. 程式人生 > >程序間通訊之訊息佇列

程序間通訊之訊息佇列

 最近發現訊息佇列的一些隱蔽的點,通過程式碼註釋記錄分享下。樣例來自https://www.cnblogs.com/52php/p/5862114.html,感謝。

 接收端程式碼如下:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/msg.h>#include <errno.h>struct msg_st{long int msg_type;char text[BUFSIZ];};int main(int argc, char **argv){int msgid = -1;
struct msg_st data;long int msgtype = 0;   // 注意1// 建立訊息佇列msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if (msgid == -1){fprintf(stderr, "msgget failed width error: %d\n"errno);exit(EXIT_FAILURE);}// 從佇列中獲取訊息,直到遇到end訊息為止while (1){        /*            1、msgrcv的第三個引數是BUFSIZ,並不是sizeof(structmsg_st)
            2、讀取訊息的時候報錯argument list too long,是傳送的長度和接受的長度不等導致的。
            3、如果有髒資料沒有及時處理掉,依然存在於核心的連結串列中,後面此msgtype接收的時候依然會報錯。

          */

if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1){fprintf(stderr, "msgrcv failed width erro: %d"errno);}printf("You wrote: %s\n", data.text);// 遇到end結束if (strncmp(data.text, "end", 3) == 0){break;}}// 刪除訊息佇列if (msgctl(msgid, IPC_RMID, 0) == -1)
{fprintf(stderr, "msgctl(IPC_RMID) failed\n");}exit(EXIT_SUCCESS);}

傳送端程式碼如下:

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/msg.h>#include <errno.h>#define MAX_TEXT 512struct msg_st{long int msg_type;char text[MAX_TEXT];};int main(int argc, char **argv){struct msg_st data;char buffer[BUFSIZ];int msgid = -1;// 建立訊息佇列msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if (msgid == -1){fprintf(stderr, "msgget failed error: %d\n"errno);exit(EXIT_FAILURE);}// 向訊息隊裡中寫訊息,直到寫入endwhile (1){printf("Enter some text: \n");fgets(buffer, BUFSIZ, stdin);data.msg_type = 1; // 注意2strcpy(data.text, buffer);// 向佇列裡傳送資料if (msgsnd(msgid, (void *)&data, MAX_TEXT, 0) == -1){fprintf(stderr, "msgsnd failed\n");exit(EXIT_FAILURE);}// 輸入end結束輸入if (

相關推薦

【Linux】Linux程序通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

【Linux】程序通訊訊息佇列、訊號量和共享儲存

訊息佇列、訊號量和共享儲存是IPC(程序間通訊)的三種形式,它們功能不同,但有相似之處,下面先介紹它們的相似點,然後再逐一說明。 1、相似點 每個核心中的IPC結構(訊息佇列、訊號量和共享儲存)都用一個非負整數的識別符號加以引用,與檔案描述符不同,當一個

程序通訊訊息佇列

 最近發現訊息佇列的一些隱蔽的點,通過程式碼註釋記錄分享下。樣例來自https://www.cnblogs.com/52php/p/5862114.html,感謝。 接收端程式碼如下:#include <stdio.h>#include <stdlib.h&

swoole程序通訊訊息佇列

1. 相關函式 2. 與訊息佇列相關的核心引數 1. 引數 kernel.msgmnb = 4203520,訊息佇列的最大位元組數 kernel.msgmni = 64,最多允許建立多少個訊息佇列 kernel.msgmax = 8192,訊

【Linux】程序通訊訊息佇列

在上一篇部落格裡,我們學習了程序間通訊的一種方式,那就是管道,今天我們繼續學習另一種方式訊息佇列。 訊息佇列 一. 什麼是訊息佇列?   訊息佇列是訊息的連結串列,存放在核心中並由訊息佇列識別符號表示。   訊息佇列提供了一個從一個程序向另一個程

Linux的程序程式設計-二-程序通訊訊息佇列

1.1         系統V訊息佇列 訊息佇列中的每個訊息都有如下的資料結構: struct msgbuf { long mtype;         // 訊息型別 char mtext[n];      // 訊息內容,n由使用者自己定義 }; 1.1.1      

Linux中程序通訊機制----訊息佇列

一、什麼是訊息 訊息(message)是一個格式化的可變長的資訊單元。訊息機制允許由一個程序給其它任意的程序傳送一個訊息。當一個程序收到多個訊息時,可將它們排成一個訊息佇列。 1、訊息機制的資料結構 (1)訊息首部 記錄一些與訊息有關的資訊,如訊息的型別、大小、

Linux系統程式設計——程序通訊訊息佇列

概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一

(三)程序通訊方式-----訊息佇列

訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別

Linux 多工程式設計——程序通訊訊息佇列(Message Queues)

概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一

程序通訊訊息佇列和共享記憶體方式的實現

共享記憶體方式使用QSharedMemory 和QSystemSemaphore兩個類實現 一個程序往共享記憶體空間中寫,一個程序往共享記憶體空間中讀 兩程序通訊時: 向共享記憶體中提供資料的一方: 1,定義QSharedMemory shareMemory,並設定標誌名shareMemory.setKey(

程序通訊----使用訊息佇列

面來說說如何用不用訊息佇列來進行程序間的通訊,訊息佇列與命名管道有很多相似之處。有關命名管道的更多內容可以參閱我的另一篇文章:Linux程序間通訊——使用命名管道 一、什麼是訊息佇列 訊息佇列提供了一種從一個程序向另一個程序傳送一個數據塊的方法。  每個資料塊都被認為含有

Linux程序通訊——使用訊息佇列

下面來說說如何用不用訊息佇列來進行程序間的通訊,訊息佇列與命名管道有很多相似之處。有關命名管道的更多內容可以參閱我的另一篇文章:Linux程序間通訊——使用命名管道 一、什麼是訊息佇列 訊息佇列提供了一種從一個程序向另一個程序傳送一個數據塊的方法。  每個資料塊都被認為含

linux 程序通訊訊息佇列以及例項

程式碼來自:嵌入式linux應用開發標準教程 訊息可以理解為寫信給某個人,這裡在應用中是告訴系統寫信人和寫信的內容就可以了, 別人會來看發信人是誰,如果不是自己想要的就放棄讀信或者只要有訊息自己就讀取訊息 訊息佇列就是按佇列的方式處理很多訊息,先發的最先被讀 訊息佇列:

Linux系統下-程序通訊訊息佇列-詳解)

Linux下程序間通訊方式: # 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序

IPC程序通訊訊息佇列

基本概念訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法。每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值。訊息佇列與管道同樣有缺陷,就是每個訊息的最大長度是有上限的(MSGMAX),每個訊息佇列的總的位元組數是有上限的(MSGMNB),系

Linux程序通訊POSIX訊息佇列

訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。

Linux程序通訊訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)

System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和

Linux 學習筆記—程序通訊 訊息佇列、訊號量、共享記憶體的概念區別聯絡

2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過

python多程序通訊訊息佇列

在linux C中,訊息佇列可以通過key來建立,在使用某個佇列時,可根據key來獲取佇列,進而進行資料的收發;且佇列的前4個位元組,可用於判斷目標程序,不匹配則不接收,也就是多個程序可共用一個佇列進行訊息的收發。 在python中則不同,沒有key,直接get接收。這就要