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