我想更改文件描述符,以便将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,但该解决方案似乎不起作用。
答案 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);