重定向子进程的文件流

时间:2016-10-08 22:00:15

标签: c++ winapi

我想控制子进程的流。基本上,我想以编程方式执行程序,为控制台输出,控制台输入和错误流创建管道线,还要为文件流创建管道线。 例如,

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操作系统是我的第一个列表。

2 个答案:

答案 0 :(得分:1)

父进程控制stdinstdoutstderr的原因很简单,因为它们是子进程实际上不会打开的唯一流。也就是说,从孩子的角度来看,它们在启动时已经启动并运行。因此,在启动子项之前,父级只需要提供stdinstdoutstderr的替代版本。为此,您可以使用管道,但也可以使用标准文件。

  

我想控制一个子进程'流。基本上,我想以编程方式执行程序,为控制台输出,控制台输入和错误流创建管道线,还要为文件流创建管道线。

目前尚不清楚。要替换控制台输出,输入和错误流,您可以使用所描述的管道功能。至于文件流'它们将由子进程本身打开,除非你能影响孩子实际打开哪个文件,否则你几乎无法控制它们。

例如,您可以创建一个名为test.txt的{​​{3}}(使用mkfifo),您的子进程将错误地使用此管道,就好像它是一个文件一样。它的行为完全不同,这可能会导致问题(seek是禁止的,写入然后回读没有预期的行为等等),但可能适用于简单的程序。

您可能需要使用正确的文件。如果您的目标是不执行磁盘访问,则可以使用named pipe,这可以在大多数Linux系统上的/dev/shm中轻松创建。

答案 1 :(得分:1)

您似乎想要控制某些进程所做的文件操作。对此的一般解决方案(在WIndows中)是文件系统minifilter驱动程序。如果驱动程序看到进程(包括内核)所做的所有文件操作,并且可以动态更改它们。例如,当它检测到进程X正在尝试将数据写入文件Y时,它可以加密数据。

但是,开发文件系统minifilter驱动程序并非易事。我认为它比开发一个驱动加密软件(如Bitlocker或TrueCrypt)更难,因为文件系统真的是复杂的野兽。