程序間通訊(ipc)方式包括:管道,fifo,訊號。這裡只提下無名管道,用於有親緣關係的程序之間。有名管道可以用在沒有親緣關係的程序之間。
qprocess,底層使用的就是無名管道。
做了乙個小demo,畢設有一塊要用到。
由於底層封裝了win linux mac不同平台的無名管道實現,避免了無謂的跨平台體力勞動。
但使用qprocess時,要注意:在主程序中向子程序寫資料時,資料結尾一定要有換行符,即"\n",否則就如同用標準輸入沒有按回車乙個效果,子程序是不會去處理你輸入的資料的,因為子程序認為你還沒有輸完。
用於子程序的程式:
#include #include using std::cout;
using std::endl;
int main(void)
cout << "bye from child process!" << endl;
return 0;
}
用於呼叫上述子程式的主程式,主程式有三個檔案組成
#ifndef parent_process_h
#define parent_process_h
#include class qprocess;
class parentprocess : public qobject
;#endif // parent_process_h
#include "parentprocess.h"
#include #include parentprocess::parentprocess(qobject *parent) :
qobject(parent)
parentprocess::~parentprocess()
void parentprocess::sender()
void parentprocess::receiver()
#include "parentprocess.h"
上述程式執行之後,子程序通過標準輸入輸出 來獲取和列印資訊,而主程式則通過無名管道,重定向子程序的輸入輸出。
外部程式未啟動時,其狀態是notrunning;
當啟動時,其狀態轉變為starting,正在啟動,但此時還未呼叫起來;
啟動之後,繼續變為running,同時發射出started()訊號,此時,可以對qprocess進行讀寫操作了;
當退出時,其狀態改為notrunning,並發射出finished()訊號。finishe()訊號會攜帶退出碼和退出狀態,可以分別通過exitcode()和exitstatus()來獲得。
當發生錯誤時,qprocess會發出乙個error()訊號,同樣的,也可以通過error()來獲得其錯誤型別,通過state()獲得當前程式的狀態。
qprocess繼承於qiodevice,因此,我們可以把它當作是乙個i/o裝置進行讀寫操作。
qprocess有兩種預定義的輸出通道:標準輸出stdout與標準錯誤stderr。
通過setreadchannel()可以選擇當前讀取輸出的通道。
當通道中的資料準備就緒時,qprocess會發出readyread()訊號。如果是標準輸出,則發出readyreadstandardoutput()訊號;如果是標準錯誤,則發出readyreadstandarderror()訊號。
常用的讀取方式有read(), readall()或getchar(),也可以通過readallstandardoutput()和readallstandarderror()讀取標準輸出和標準錯誤通道中的資料。
某些程式需要環境設定才能進行特殊的操作。可以通過setenvironment()來設定環境變數,通過setworkingdirectory()來設定工作目錄,預設的工作路徑是當前呼叫程式的工作路徑。
Linux程序間通訊之無名管道
在學習了linux程序間通訊之後,打算對所學的知識進行乙個系統的整理,形成乙個自己的系列,方便以後的複習與再次學習。第一次寫部落格,才疏學淺,有錯誤的地方請大佬們指正!管道的實現原理 管道檔案是乙個特殊的檔案,是由佇列實現的 如何建立管道?使用pipe 函式建立管道 pipe 函式 標頭檔案unis...
Linux下程序通訊之 無名管道
程序通訊 程序與程序間的資料交換,稱為程序通訊。程序通訊的方式有 共享記憶體 訊號量 管道 訊息佇列 socket等等。管道 是一種基於檔案描述符的通訊方式,可以呼叫read write和close等操作檔案的介面來操作。它是基於檔案描述符的通訊方式,它是半雙工模式。分為有名管道和無名管道。無名管道...
程序通訊 無名管道
管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。管道提供了簡單的流控制機制,程...