我想更改文件描述符,以便将我的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回答,但该解决方案似乎不起作用。
'execvp'不会成功返回。 'execvp'“用新的过程映像替换当前的过程映像”。也就是说,除非'execvp'调用有错误,'execvp'之后的任何代码都不会执行。在调用'execvp'之前,你可能首先要'fork'。 – kaylum
你有没有计算出为什么其他答案不起作用?它提供了可靠的建议(我的并不是被接受的答案)。它会工作,如果你的程序是理智的 - 问题中的例子没有'fork()',所以在成功执行'execvp()'后没有执行任何操作。如果'execvp()'工作,最后三行永远不会执行。你可以把''ls''字符串改成''不是-ls''(假设你没有一个叫'not-the-ls'的命令),然后重新运行;那么你会看到'to console'消息。 –
正确;唯一一次exec *()函数返回的是系统执行任何请求时执行失败的时间。 –