![](/img/trans.png)
[英]Is it possible to redirect child process's stdout to another file in parent process?
[英]Redirect a file stream of a child process
我想控制子進程的流。 基本上,我想以編程方式執行程序,為控制台輸出,控制台輸入和錯誤流創建管道,還為文件流創建管道。 例如,
int main (int, char * []) {
printf ("Hello, World!\n"); // I want to capture this,
FILE * fp = fopen ("test.txt", "r"); // send data through this stream,
fclose (fp);
fprintf (stderr, "Bye, World!\b"); // and finally capture this message.
return 0;
}
我的目標是執行Microsoft Word之類的程序,並將讀取的文件數據發送到該程序。 我正在創建一個加密軟件,可以將數據保留在驅動器中,並在需要時安全地取出數據。 SanDisk保管庫的事情也做了類似的工作,但似乎它在硬盤中的某個位置創建了一個臨時文件,但是我不想創建臨時文件。
我咨詢了Google,Google展示了popen
函數和CreatePipe
函數,但是這些函數為stdout,stdin和stderr流創建了管道,但沒有文件流。
我同時需要Linux和Windows,但是Windows OS在我的第一個列表中。
父進程易於控制stdin
, stdout
和stderr
的原因是,它們是子進程實際上未打開的唯一流。 也就是說,從孩子的角度來看,他們在開始時已經啟動並運行。 因此,父級僅需要在啟動子級之前提供stdin
, stdout
和stderr
替代版本。 為此,您可以使用管道,但也可以使用標准文件。
我想控制子進程的流。 基本上,我想以編程方式執行程序,為控制台輸出,控制台輸入和錯誤流創建管道,還為文件流創建管道。
這還不清楚。 要替換控制台輸出,輸入和錯誤流,可以使用您描述的管道功能。 至於文件“流”,它們將由子進程本身打開,除非您可以影響子進程實際打開的文件,否則您將幾乎無法控制它們。
例如,您可以創建一個名為 test.txt
的命名管道 (使用mkfifo
),您的子進程將錯誤地使用此管道,就像它是一個文件一樣。 它的行為真的很不同,這可能會導致問題( seek
是禁伐,然后寫回讀沒有預期的行為,等...),但可通過簡單的程序可能會奏效。
您可能需要使用適當的文件。 如果您的目標是不執行磁盤訪問,則可以使用一個內存映射文件 ,該文件可以在大多數Linux系統上的/dev/shm
輕松創建。
您似乎想要控制某些進程執行的文件操作。 一個通用的解決方案(在Windows中)是文件系統微型過濾器驅動程序。 驅動程序可以查看進程(包括內核)進行的所有文件操作,並可以即時更改它們。 例如,當它檢測到進程X試圖將數據寫入文件Y時,它可以對數據進行加密。
但是,開發文件系統微型過濾器驅動程序並非易事。 我希望比開發驅動器加密軟件(例如Bitlocker或TrueCrypt)要困難得多,因為文件系統確實是復雜的野獸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.