1

现在,我正在开发一个项目,在该项目中我从命令行自动编译 .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 错误消息打印到终端。如果我想将此错误重定向到文件,我将如何捕获它?

4

1 回答 1

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);
    }

或者,如果您只想读取父进程或另一个子进程中的结果,您可以考虑使用 apipe而不是open-ing 文件。

于 2014-02-18T20:40:09.303 回答