QProcess 程序通訊之無名管道

2021-07-07 07:47:28 字數 1945 閱讀 2811

程序間通訊(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等操作檔案的介面來操作。它是基於檔案描述符的通訊方式,它是半雙工模式。分為有名管道和無名管道。無名管道...

程序通訊 無名管道

管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。管道提供了簡單的流控制機制,程...