程序間的通訊方式_訊息佇列
訊息佇列:提供了一種從一個程序向另一個程序傳送一個數據塊的方法,而且每個資料塊都被認為含有一個型別,接收程序可以獨立地接受含有不同型別值得資料塊。
訊息:資料 & 型別
佇列:一種資料結構,先進先出
訊息佇列:是一種臨時儲存資訊的佇列,完成程序間的資料傳遞,優先順序佇列
訊息佇列的特點:
1.與訊號量相比:都以核心物件來確保多程序訪問同一個訊息佇列,訊號量進行同步控制,訊息佇列傳送實際資料。
2.與管道相比:管道傳送的資料沒有型別,讀取資料端無差別從管道中按照資料的前後順序讀取資料,訊息佇列資料有型別,讀端可以根據資料型別讀取特定資料。
訊息佇列的相關操作:
建立或獲取:int msgget((key_t)key, int flag);
key:鍵值
flag:許可權以及控制,由9個許可權標誌組成。由IPC_CREAT定義的一個特殊位必須和許可權標誌按位或才能建立一個新的訊息佇列。
如果訊息佇列已經存在,則直接獲取;如果不存在,則建立。
成功時 msgget 函式返回一個正整數,即佇列識別符號,失敗時返回-1;
傳送訊息:int msgsnd(int msgid, void *ptr, size_t size, int flag);
msgid:是由 msgget 函式返回的 訊息佇列識別符號
ptr:指向一個結構體:型別+資料
size:資料的大小
成功時這個函式返回 0,失敗時返回 -1。如果呼叫成功,訊息佇列資料的一份副本將被放到訊息佇列中。
獲取訊息:int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);
刪除訊息佇列:int msgctl(int msgid, int cmd, struct msgid_ds *buff);
cmd:是將要採取的動作,它可以取 3 個值:IPC_STAT,IPC_SET,IPC_RMID
migid_ds 的結構體至少包含一下成員:
struct msgid_ds
{
uid_t msg_perm.uid;
uid_t msg_perm.gid;
mode_t msg_perm.mode;
}
成功是它返回 0,失敗時返回 -1。
練習:A 程序負責根據使用者選擇的資料型別(long)傳送使用者輸入的資料(char *),B 程序讀取1000型別的資料,C 程序讀取2000型別的資料
A程序程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msgbuff
{
long type;
char data[128];
};
void main()
{
int msgid = msgget((key_t)1234, IPC_CREAT|0664);
assert(msgid != -1);
struct msgbuff buffer;
buffer.type = 1000;
strcpy(buffer.data, "hello");
msgsnd(msgid, &buffer, strlen(buffer.data), 0);
buffer.type = 2000;
strcpy(buffer.data,"world");
msgsnd(msgid, &buffer, strlen(buffer.data), 0);
}
B 程序程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
struct msgbuff
{
long type;
char data[128];
};
void main()
{
int msgid = msgget((key_t)1234, IPC_CREAT|0664);
assert(msgid != -1);
struct msgbuff buffer;
memset(&buffer, 0, sizeof(buffer));
msgrcv(msgid, &buffer, 127, 1000, 0);
printf("%s\n", buffer.data);
}
C 程序程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
struct msgbuff
{
long type;
char data[128];
};
void main()
{
int msgid = msgget((key_t)1234, IPC_CREAT|0664);
assert(msgid != -1);
struct msgbuff buffer;
memset(&buffer, 0, sizeof(buffer));
msgrcv(msgid, &buffer, 127, 2000, 0);
printf("%s\n", buffer.data);
}
測試執行結果如下:
相關推薦
程序間通訊方式總結——訊息佇列
Linux/Unix系統IPC是各種程序間通訊方式的統稱,但是其中極少能在所有Linux/Unix系統實現中進行移植。隨著POSIX和Open Group(X/Open)標準化的推進
程序間的通訊方式_訊息佇列
訊息佇列:提供了一種從一個程序向另一個程序傳送一個數據塊的方法,而且每個資料塊都被認為含有一個型別,接收程序可以獨立地接受含有不同型別值得資料塊。 訊息:資料 & 型別 佇列:一種資料結構,先進先出 訊息佇列:是一種臨時儲存
Linux程序間通訊之POSIX訊息佇列
訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。
多程序程式設計之程序間通訊-管道和訊息佇列
1.程序間通訊 Linux作為一種新興的作業系統,幾乎支援所有的Unix下常用的程序間通訊方法:管道、訊息佇列、共享記憶體、訊號量、套介面等等。 2.管道 管道是程序間通訊中最古老的方式,它包括無名管道(或者匿名管道)和有名管道兩種,前者用於父程序和
程序間通訊——管道,訊息佇列,共享記憶體
程序間通訊的本質是讓兩個不相干的程序看到同一份資源。這個資源是由作業系統提供的一個檔案。程序間通訊的目的:1.資料傳輸:一個程序需要將它 的資料傳送給另一個程序。2.資源共享:多個程序之間共享同樣的資源。3.通知事件:一個程序需要向另一個(組)程序傳送訊息,通知它們發生了
程序間通訊(IPC)之訊息佇列
★IPC方法包括管道(PIPE)、訊息佇列(Message_Queue)、旗語、共用記憶體(ShareMemory)以及套接字(Socket)。進 程間通訊主要包括了管道、系統IPC(包括了訊息佇列、
Linux---程序間通訊IPC之訊息佇列
**程序間通訊(IPC):**是指在不同程序之間傳播或交換資訊。 **IPC的方式:**通常有管道(無名管道、命名管道)、訊息佇列、訊號量、共享儲存、Socket、Streams等(Socket和Streams支援不同主機上的兩個程序IPC) 程序間通訊的目
程序間通訊---管道和訊息佇列
程序間通訊的目的:資料傳輸:一個程序需要將它的資料傳送給另一個程序資源共享:對個程序之間共享同樣的資源通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它們發生了什麼事件程序控制:有些程序希望完全控制另一個程序的執行(如:Debug程序)程序間通訊的發展:管道:Syste
嵌入式Linux併發程式設計,程序間通訊方式,System V IPC,訊息佇列,開啟/建立msgget(), 傳送訊息msgsnd(),格式,接收訊息msgrcv(),控制訊息佇列 msgctl()
文章目錄 1,訊息佇列 2,訊息佇列結構 3,訊息佇列使用步驟 3.1,開啟/建立訊息佇列 msgget() 3.1.1,開啟/建立訊息佇列---示例msgget() 3.2,向訊息佇列傳送訊息 msgs
(三)程序間通訊方式-----訊息佇列
訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別
Linux下程序間通訊方式之管道、訊號、共享記憶體、訊息佇列、訊號量、套接字
/* 1,程序間通訊 (IPC ) Inter-Process Communication 比較好理解概念的就是程序間通訊就是在不同程序之間傳播或交換資訊。 2,linux下IPC機制的分類:管道、訊號、共享記憶體、訊息佇列、訊號量、套接字 3,這篇主要說說管
linux 程序間通訊方式
1 無名管道通訊 無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2 高階管道通訊 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序
Linux下程序間通訊方式 - UNIX Domain Socket
概述 Linux下程序通訊方式有很多,比較典型的有套接字,平時比較常用的套接字是基於TCP/IP協議的,適用於兩臺不同主機上兩個程序間通訊, 通訊之前需要指定IP地址. 但是如果同一臺主機上兩個程序間通訊用套接字,還需要指定ip地址,有點過於繁瑣. 這個時候就需要用到UNIX Domain Sock
面試必問:程序與執行緒的異同以及程序間通訊方式
秋招面試必問的題目,感覺今年被問了差不多10次了。 1.程序與執行緒 程序:具有獨立功能的程式關於某個資料集合上的一次執行活動。 執行緒:程序的一個實體。 比喻:一列火車是一個程序,火車的每一節車廂是執行緒。 2.程序與執行緒的聯絡 ①一個執行緒只能屬於一個程序,一個程序
最快的程序間通訊方式你get了麼
前言:天下武功為快不破!在資訊爆炸、快速發展的新時代...,扯遠了...。程序間通訊方式有很多,但最快的方式你知道麼?由我娓娓道來... 一、共享記憶體方式 主角閃亮登場了,噔噔瞪...,最快的方式就是共享記憶體了。實現共享記憶體的方式主要有兩種: 儲存對映I/O mmap函式實現 s
嵌入式Linux併發程式設計,程序間通訊方式,System V IPC,訊號燈集,建立/開啟semget(),初始化semctl(),P/V操作semop(),sembuf結構體定義
文章目錄 1,System V IPC - 訊號燈 2,System V IPC - 訊號燈特點 3,System V訊號燈使用步驟 3.1,訊號燈建立/開啟 semget() 3.2,訊號燈初始化 semctl()
嵌入式Linux併發程式設計,程序間通訊方式,System V IPC物件,ftok(),共享記憶體使用步驟,建立shmget(),對映shmat(),撤銷對映shmdt(),控制shmctl(),注意
文章目錄 1,System V IPC 2,使用IPC物件的大致流程 3,生成KEY值ftok() ftok示例 4,共享記憶體 4.1,共享記憶體使用步驟 4.2,共享記憶體建立 shmget()
Linux程序間通訊方式一:有名管道FIFO
有名管道 我們經常把FIFO稱為有名管道(命名管道)。使用它可以實現兩個不相干的程序之間的通訊。它雖然被稱之為檔案,但是管道檔案在磁碟上只有一個inode結點,這個ionde結點指向的是記憶體中的一塊區域,當A程序建立並使用有名管道時,直接把資料寫入記憶體中,而B程序也是直
嵌入式Linux併發程式設計,程序間通訊方式,無名管道,無名管道特點,無名管道建立pipe(),獲取管道大小,管道斷裂
1,Linux下的程序間通訊機制 Linux下的程序間通訊機制 應用 早期UNIX程序間通訊方式(很多是從Unix繼承的) 無名管道(pipe) 本地通訊,用於一臺計算機內部不同程序之間的通訊
嵌入式Linux併發程式設計,程序間通訊方式,有名管道,有名管道特點,有名管道建立mkfifo()
1,有名管道的特點 對應管道檔案,可用於任意程序之間進行通訊:有名管道建立好之後,在系統中有實際的檔案和有名管道對應,任意兩個程序可以通過路徑和檔名指定同一個有名管道進行通訊 開啟管道時可指定讀寫方式:有名管道用open()開啟的時候可以指定不同的讀寫方