如何重定向execvp调用生成的gcc错误?

时间:2014-02-18 20:26:26

标签: c compilation execvp

现在,我正在开发一个项目,我从命令行自动编译.c文件。 为此,我使用以下代码:

bool auto_compile(process_t *p) {
    char* file_name = p->argv[0];
    char* compile_args[] = {"gcc", "-o", "devil", file_name, NULL};
    int status, pid;
    switch(pid = fork()) {
        case -1:
            logger("fork", 1);
            exit(EXIT_FAILURE);
        case 0:
            execvp("gcc", compile_args);    
        default:
            waitpid(pid, &status, WUNTRACED);
            if(WIFEXITED(status)) {
                if(status != EXIT_SUCCESS) {
                   logger("Error, could not compile", 4);
               return false;
                }
            }    
     }
     return true;
}

当我输入gcc的无效参数(即文件名无效)时,它会将gcc错误消息输出到终端。如果我想将此错误重定向到文件,我将如何捕获它?

1 个答案:

答案 0 :(得分:0)

与大多数程序一样,gcc将普通输出(如果使用-E开关)写入文件描述符1,将错误消息写入文件描述符2. exec - ed进程通常会继承打开的文件描述符来自其父母。如果您不希望fd 1和2成为shell的终端,可以使用dup2替换它们。

switch(pid = fork()) {
    /*...*/
    case 0: {
        int gccerr_fd = open("gcc_errors.txt", O_CREAT|O_WRONLY);
        if (gccerr_fd > 0) {
            dup2(gccerr_fd, 2);
            close(gccerr_fd);
        }
        execvp("gcc", compile_args);
    }

或者,如果您只想阅读父进程或其他子进程中的结果,可以考虑使用pipe代替open文件。