我试图将子进程的IO(在fork()
之后重定向到文件中,但我不知道为什么它不起作用。
这就是我所做的:
if(fork() == 0){
execv(exe, (char*[]){ exe, "> temp.exe" });
...
可执行文件将运行,但不会重定向到文件。如果有人能解释我在做什么错,以及我应该怎么做,我将不胜感激。我觉得我需要在execv()
之前重定向,但我不知道如何重定向。
谢谢!
答案 0 :(得分:3)
Shell重定向(如> file
)由Shell实现。通过使用execve()
,您将绕过Shell;子进程将在"> temp.exe"
中看到argv
,并将尝试将其作为参数进行处理。
如果要将输出重定向到文件,最简单的方法是自己实现该重定向,方法是在派生后打开文件并使用dup2()
将其文件描述符移至标准输出:
if (fork() == 0) {
int fd = open("temp.exe", O_CREAT | O_WRONLY, 0666);
if (fd < 0) { handle error... exit(255); }
dup2(fd, 1);
close(fd);
execv(exe, ...);
}
答案 1 :(得分:0)
execX()调用家族与system()或popen()的灵活性不同。后面这些方法调用shell来解释命令。
execX调用的参数是您要运行的程序的确切路径,以及您要赋予该程序的参数。任何“外壳”功能(例如重定向)都必须在调用execX之前实现。
或者,您可以让shell实际完成工作,execp("sh","sh",myexe+" >test.txt");
,但这很懒,为什么不使用系统呢?
两个非常有用的方法是pipe()和dup2():pipe允许您创建到主机程序的管道; dup2允许您设置一种方案,其中正在执行的程序认为它正在写入stdout(1)或从stdin(0)读取,但实际上是在写入或读取您创建的文件或管道。
通过阅读pipe和dup2的手册页,或者在google中查找exec pipe和dup2的手册页,您会走很长一段路,所以我不会在这里编写完整的实现来带给您乐趣。