2016-09-30 98 views
2

我想更改文件描述符,以便将我的execvp命令发送到文件。之后,我想将stdout重置回控制台。C将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不打印任何地方。

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

+4

'execvp'不会成功返回。 'execvp'“用新的过程映像替换当前的过程映像”。也就是说,除非'execvp'调用有错误,'execvp'之后的任何代码都不会执行。在调用'execvp'之前,你可能首先要'fork'。 – kaylum

+0

你有没有计算出为什么其他答案不起作用?它提供了可靠的建议(我的并不是被接受的答案)。它会工作,如果你的程序是理智的 - 问题中的例子没有'fork()',所以在成功执行'execvp()'后没有执行任何操作。如果'execvp()'工作,最后三行永远不会执行。你可以把''ls''字符串改成''不是-ls''(假设你没有一个叫'not-the-ls'的命令),然后重新运行;那么你会看到'to console'消息。 –

+0

正确;唯一一次exec *()函数返回的是系统执行任何请求时执行失败的时间。 –

回答

2

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

0

关于重新分配标准输出去到不同的位置

这是来自: 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);