我想控制子进程的流。基本上,我想以编程方式执行程序,为控制台输出,控制台输入和错误流创建管道线,还要为文件流创建管道线。 例如,
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操作系统是我的第一个列表。
答案 0 :(得分:1)
父进程控制stdin
,stdout
和stderr
的原因很简单,因为它们是子进程实际上不会打开的唯一流。也就是说,从孩子的角度来看,它们在启动时已经启动并运行。因此,在启动子项之前,父级只需要提供stdin
,stdout
和stderr
的替代版本。为此,您可以使用管道,但也可以使用标准文件。
我想控制一个子进程'流。基本上,我想以编程方式执行程序,为控制台输出,控制台输入和错误流创建管道线,还要为文件流创建管道线。
目前尚不清楚。要替换控制台输出,输入和错误流,您可以使用所描述的管道功能。至于文件流'它们将由子进程本身打开,除非你能影响孩子实际打开哪个文件,否则你几乎无法控制它们。
例如,您可以创建一个名为test.txt
的{{3}}(使用mkfifo
),您的子进程将错误地使用此管道,就好像它是一个文件一样。它的行为完全不同,这可能会导致问题(seek
是禁止的,写入然后回读没有预期的行为等等),但可能适用于简单的程序。
您可能需要使用正确的文件。如果您的目标是不执行磁盘访问,则可以使用named pipe,这可以在大多数Linux系统上的/dev/shm
中轻松创建。
答案 1 :(得分:1)
您似乎想要控制某些进程所做的文件操作。对此的一般解决方案(在WIndows中)是文件系统minifilter驱动程序。如果驱动程序看到进程(包括内核)所做的所有文件操作,并且可以动态更改它们。例如,当它检测到进程X正在尝试将数据写入文件Y时,它可以加密数据。
但是,开发文件系统minifilter驱动程序并非易事。我认为它比开发一个驱动加密软件(如Bitlocker或TrueCrypt)更难,因为文件系统真的是复杂的野兽。