在C中,如何在执行execvp()或类似的调用时将stdin / stdout / stderrredirect到文件?

我有以下代码:

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()调用的input/输出仍然是控制台,而不是文件。 显然我做错了什么,做这个的正确方法是什么?

正确的做法是用dup2()用打开的文件replace文件描述符STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO 。 您还应该closuressubprocess中的原始文件:

 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 ... } 

看看freopen函数。

我必须做类似的stdout并写了两个function,为我做的工作:

 static int fd; static fpos_t pos; void switchStdout(const char *newStream) { fflush(stdout); fgetpos(stdout, &pos); fd = dup(fileno(stdout)); freopen(newStream, "w", stdout); } void revertStdout() { fflush(stdout); dup2(fd, fileno(stdout)); close(fd); clearerr(stdout); fsetpos(stdout, &pos); } 

当stdin,stdout,stderr是terminal-

 //change stdin,stdout,stderr freopen("new_stdin","r",stdin); freopen("new_stdout","r",stdout); freopen("new_stderr","r",stderr); //----do something; //reset stdin,stdout,stderr freopen("/dev/tty","r",stdin); freopen("/dev/tty","r",stdout); freopen("/dev/tty","r",stderr);