![](/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.