C-重定向子进程的IO

时间:2019-04-02 16:32:36

标签: c fork exec

我试图将子进程的IO(在fork()之后重定向到文件中,但我不知道为什么它不起作用。

这就是我所做的:

if(fork() == 0){
    execv(exe, (char*[]){ exe, "> temp.exe" });
    ...

可执行文件将运行,但不会重定向到文件。如果有人能解释我在做什么错,以及我应该怎么做,我将不胜感激。我觉得我需要在execv()之前重定向,但我不知道如何重定向。

谢谢!

2 个答案:

答案 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的手册页,您会走很长一段路,所以我不会在这里编写完整的实现来带给您乐趣。