C将stdout指向文件然后重置

时间:2016-09-30 02:26:49

标签: c stdout file-descriptor execvp output-redirect

我想更改文件描述符,以便将stdout命令发送到文件。之后,我想将int main() { printf("to console\n"); int stdoutfd = dup(STDOUT_FILENO); FILE* file = fopen("./test.txt","ab+"); int filefd = fileno(file); dup2(filefd,STDOUT_FILENO); char *args[] = {"ls","-la",NULL}; execvp(args[0],args); dup2(stdoutfd,STDOUT_FILENO); close(stdoutfd); printf("to console\n"); } 重置回控制台。

这是我到目前为止所做的:

printf

第一个test.txt打印到控制台,然后是" ls -la"上的execvp。命令打印到printf文件,但我的问题是第二个-pthread不会在任何地方打印。

我意识到类似的问题已得到解答 C restore stdout to terminal,但该解决方案似乎不起作用。

2 个答案:

答案 0 :(得分:2)

之后没有了。 execvp函数调用将替换您的进程。如果成功,则其余代码不会执行。

答案 1 :(得分:0)

关于重新分配stdout以转到其他位置

这是来自: http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c

为什么要使用freopen()? C89规范在以下部分的尾注之一中有答案:

116. The primary use of the freopen function is to change the file associated with a standard text stream (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value returned by the fopen function may be assigned.

freopen通常被误用,例如stdin = freopen(" newin"," r",stdin);.这不比fclose(stdin)更便携; stdin = fopen(" newin"," r");.两个表达式都尝试分配给stdin,这不能保证可以赋值。

使用freopen的正确方法是省略赋值:freopen(" newin"," r",stdin);