簡體   English   中英

重定向子進程的文件流

[英]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在我的第一個列表中。

父進程易於控制stdinstdoutstderr的原因是,它們是子進程實際上未打開的唯一流。 也就是說,從孩子的角度來看,他們在開始時已經啟動並運行。 因此,父級僅需要在啟動子級之前提供stdinstdoutstderr替代版本。 為此,您可以使用管道,但也可以使用標准文件。

我想控制子進程的流。 基本上,我想以編程方式執行程序,為控制台輸出,控制台輸入和錯誤流創建管道,還為文件流創建管道。

這還不清楚。 要替換控制台輸出,輸入和錯誤流,可以使用您描述的管道功能。 至於文件“流”,它們將由子進程本身打開,除非您可以影響子進程實際打開的文件,否則您將幾乎無法控制它們。

例如,您可以創建一個名為 test.txt命名管道 (使用mkfifo ),您的子進程將錯誤地使用此管道,就像它是一個文件一樣。 它的行為真的很不同,這可能會導致問題( seek是禁伐,然后寫回讀沒有預期的行為,等...),但可通過簡單的程序可能會奏效。

您可能需要使用適當的文件。 如果您的目標是不執行磁盤訪問,則可以使用一個內存映射文件 ,該文件可以在大多數Linux系統上的/dev/shm輕松創建。

您似乎想要控制某些進程執行的文件操作。 一個通用的解決方案(在Windows中)是文件系統微型過濾器驅動程序。 驅動程序可以查看進程(包括內核)進行的所有文件操作,並可以即時更改它們。 例如,當它檢測到進程X試圖將數據寫入文件Y時,它可以對數據進行加密。

但是,開發文件系統微型過濾器驅動程序並非易事。 我希望比開發驅動器加密軟件(例如Bitlocker或TrueCrypt)要困難得多,因為文件系統確實是復雜的野獸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM