繁体   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