Linux Pipe (程序間通訊,生產者消費者)
PIPE是Linux下可以用來實現程序間通訊的一種手段,當我們呼叫pipe系統呼叫時,將會產生一對檔案描述符,fd[0]可以用來讀,fd[1]用來寫,fd[1]寫的資料將會在fd[0]中讀到,我們稱之為管道。程序之間可以依賴管道的方式實現程序間通訊,pipe是半雙工的,所以如果要實現pipe之間互相通訊的話,需要建立2對pipe。下面我們演示用pipe實現父程序生產數字,子程序消費數字並排序的一個程式。
#include <iostream>
#include <unistd.h>
#include <vector>
#include <algorithm>
#include <sys/types.h>
#include <sys/wait.h>
#define END_FLAG (1 << (sizeof(int)*8 - 1))
using namespace std;
enum PIPE_FD_TYPE {
PIPE_READ = 0,
PIPE_WRITE
};
int main() {
int pipe_fd[2] = {-1, -1};
if(pipe(pipe_fd) != 0) {
exit(0);
}
int pid = -1;
if ((pid = fork()) == -1) {
exit(0);
}
//child
if(pid == 0) {
cout<<"child start\n";
int data = -1;
vector<int> v;
while(read(pipe_fd[PIPE_READ], &data, sizeof(data)) > 0) {
if(data == END_FLAG) {
break;
}
v.push_back(data);
}
cout <<"size : "<<v.size()<<endl;
sort(v.begin(), v.end());
for(auto i : v) {
cout<<i<<" ";
}
cout<<endl;
cout<<"child end\n";
}
//parent
if(pid != 0) {
cout<<"parent start\n";
int v[] = {134, 123, 1111, -1, 0, 888, 7564, 976, 9876, 66, 99, 123, 189};
for(int i = 0; i < sizeof(v)/sizeof(v[0]); i++) {
write(pipe_fd[PIPE_WRITE], &v[i], sizeof(v[i]));
}
int end = END_FLAG;
write(pipe_fd[PIPE_WRITE], &end, sizeof(end));
int status = -1;
waitpid(-1, &status, 0);//等待子程序結束
cout<<"paranet end\n";
}
return 0;
}
相關推薦
Linux Pipe (程序間通訊,生產者消費者)
PIPE是Linux下可以用來實現程序間通訊的一種手段,當我們呼叫pipe系統呼叫時,將會產生一對檔案描述符,fd[0]可以用來讀,fd[1]用來寫,fd[1]寫的資料將會在fd[0]中讀到,我們稱之為管道。程序之間可以依賴管道的方式實現程序間通訊,pipe是半
Linux FIFO (程序間通訊,生產者消費者)
上一篇中我們寫到了PIPE無名管道,的確是一種很方便的通訊機制,但是其有一個缺點就是,PIPE是依賴於檔案描述符的,並不在檔案系統中維護,如果兩個通訊程序之間沒有共同的祖先,他們就無法拿到相同的檔案表項,所以沒有共同祖先的兩個程序是不能通過PIPE直接通訊的。為
Linux程序間通訊與生產者消費者問題
生產者消費者問題(英語:Producer-consumerproblem),也稱有限緩衝問題(英語:Bounded-bufferproblem),是一個多執行緒同步問題的經典案例。該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的“生產者”和“消費者”——在實際執行時會
執行緒間通訊,生產者消費者問題!
2、忙等待 1.執行緒間通訊的共享物件(Product) Product類是生產者與消費者的共享類,是實現他們之間資料的共享物件。生產者生產Product,消費者消費Product,所以在Product類中,分別有一個make和一個sale方法。注意,在這兩個方法中,都使用了synchronize
Linux系統程式設計——程序間通訊:管道(pipe)
管道的概述 管道也叫無名管道,它是是 UNIX 系統 IPC(程序間通訊) 的最古老形式,所有的 UNIX 系統都支援這種通訊機制。 無名管道有如下特點: 1、半雙工,資料在同一時刻只能在一個方向上流動。 2、資料只能從管道的一端寫入,從另一端讀出。
Linux下的程序概論與程式設計三(程序間通訊的5種方式)
一、程序間通訊 1、IPC—-InterProcess Communication 每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都看不到所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者
Windows API 程序間通訊,管道(Pipe)
通過pipe程序間通訊**************************************//* 標頭檔案 */#include <windows.h> #include <stdio.h>#include <tchar.h>/* 常量 */#define PIPE
Linux系統下-程序間通訊(訊息佇列-詳解)
Linux下程序間通訊方式: # 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序
一個小Demo來理解關於IPC(程序間通訊)中的aidl
專案地址: Server端程式碼:Server端程式碼連結 Client端程式碼:Client端程式碼連結 1、IPC的基本要求 IPC(Inter-Process Communication)程序間通訊是要在兩個相互獨立的程序之間進行資訊的傳遞,在Android中每個程序都會被分配
linux通過訊號程序間通訊例項理解
在linux系統程式設計的學習中,通過訊號進行程序簡編譯是一大重點 本文通過一個例項加強對sigemptyset、sigprocmask的理解 int sigaction(int signum, const struct sigaction *act,struct sigactio
Linux系統程式設計——程序間通訊:共享記憶體
概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序都會察覺到這個更改。 共享記憶體的特點: 1)共
Linux系統程式設計——程序間通訊:訊息佇列
概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一
Linux系統程式設計——程序間通訊:訊號中斷處理
什麼是訊號? 訊號是 Linux 程序間通訊的最古老的方式。訊號是軟體中斷,它是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊的方式 。訊號可以導致一個正在執行的程序被另一個正在執行的非同步程序中斷,轉而處理某一個突發事件。 “中斷”在我們生活中經常遇到,譬如,我正在
Linux系統程式設計——程序間通訊概述
程序是一個獨立的資源分配單元,不同程序(這裡所說的程序通常指的是使用者程序)之間的資源是獨立的,沒有關聯,不能在一個程序中直接訪問另一個程序的資源(例如開啟的檔案描述符)。 但是,程序不是孤立的,不同的程序需要進行資訊的互動和狀態的傳遞等,因此需要程序間通訊( IPC:Inter Pr
【linux開發】程序間通訊命名管道-共享記憶體-記憶體對映-訊息佇列-訊號量
程序間通訊命名管道-共享記憶體-記憶體對映-訊息佇列-訊號量 在Unix平臺上,建立命名管道是建立了一個fifo檔案,和在shell下面用mkfifo命令的效果是一樣的。看起來這個管道檔案就是一個普通的檔案系統瓜掛載點,但是它只不過是作為一個名稱存在,實際的內容是一塊系統
共享記憶體多程序間通訊,程序間同步使用訊號量來實現
Linux 環境下C程式設計指南,通過共享記憶體進行程序間通訊的例子,程序間同步使用訊號量來實現。 程式碼 11-5 使用說明:這是一個簡單的伺服器和客戶端程式,如果啟動程式時不帶引數,則執行伺服器程式; 如果帶引數,則執行客戶端程式,所帶引數只有一個,就是伺服器端所顯
Linux socket本地程序間通訊
使用套接字除了可以實現網路間不同主機間的通訊外,還可以實現同一主機的不同程序間的通訊,且建立的通訊是雙向的通訊。socket程序通訊與網路通訊使用的是統一套介面,只是地址結構與某些引數不同。 一、建立socket流程 (1)建立socket,型別為AF_LOCAL或A
java中程序間通訊,基於檔案和共享記憶體
附上編譯執行的原始碼: 1,請分別建立兩個工程來進行讀寫操作; 2,請在相應的目錄建立一個檔案例如:/home/tory/workspace/sharedMemory.txt 3,往檔案中輸入超過12個位元組資料:echo asldkjasldkddas > /hom
android IPC(程序間通訊)機制
一、多程序的情況 1. 一個應用因為某些原因自身需要採用多程序模式實現。 可能是某些模組由於特殊原因需要執行在單獨的執行緒中;或是為了增大一個應用可以使用的記憶體空間。android對單個應用使用的最大記憶體做了限制,早期一些版本是16M,不同裝置有不同的大小。
談談Android的IPC(程序間通訊)機制
一說明 Android系統最常見也是初學者最難搞明白的就是Binder了,很多很多的Service就是通過Binder機制來和客戶端通訊互動的。所以搞明白Binder的話,在很大程度上就能理解程式執行的流程。 我們這裡將以MediaService的例子來分析Binder的