一尘不染

在C语言中,如何在执行execvp()或类似调用时将stdin / stdout / stderr重定向到文件?

linux

我有以下代码:

pid_t pid = fork();
if (pid == -1)
{
    // ...
}
else if (pid == 0)
{
    stdin = someopenfile;
    stdout = someotherfile;
    stderr = somethirdopenfile;
    execvp(args[0], args);
    // handle error ...
}
else
{
    // ...
}

问题是,execvp()调用的输入/输出仍然是控制台,而不是文件。显然我做错了什么,正确的方法是什么?


阅读 350

收藏
2020-06-02

共1个答案

一尘不染

正确的方法是替换文件描述符STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO使用打开的文件dup2()。然后,您还应该在子进程中关闭原始文件:

else if (pid == 0)
{
    dup2(fileno(someopenfile), STDIN_FILENO);
    dup2(fileno(someotherfile), STDOUT_FILENO);
    dup2(fileno(somethirdopenfile), STDERR_FILENO);
    fclose(someopenfile);
    fclose(someotheropenfile);
    fclose(somethirdopenfile);
    execvp(args[0], args);
    // handle error ...
}
2020-06-02