c - 将输出重定向回C中的终端
问题描述
if (out) {
out = 0;
int fd = open(output_file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) perror("open for writing");
if (dup2(fd, STDOUT_FILENO) < 0) { perror("dup2"); abort();}
close(fd);
}
if (-1 == execvp(argv[0], argv)) {
perror("execvp");
printf(" (couldn't find command)\n");
}
exit(1);
在将输出重定向到单独的文件后,我试图将输出重定向回终端。目前,这在我打电话时有效:
$ ls > file.txt
但是,当我打电话时
$ ls -l
之后,它继续将其输出定向到 file.txt,而不是终端。
解决方案
关闭所有副本后,您将无法取回原始标准输出。
通常,如果您要执行另一个具有重定向输出的程序,您首先fork()
是一个子程序,然后仅在子程序中应用重定向,然后如果执行失败,则让子程序立即终止。父母的流不受影响,因此无需恢复它们。这就是 shell 在运行外部命令时所做的事情。
但是要回答提出的问题,如果您希望能够重定向标准输出然后再恢复它,您需要先复制它...
int stdout_save = dup(STDOUT_FILENO);
然后执行重定向。准备好恢复时,只需将保存的文件描述符复制回来,然后关闭 dupe。
dup2(stdout_save, STDOUT_FILENO);
close(stdout_save);
不要忽视对这些函数调用的返回值进行适当的检查;为了清晰和简洁,我在示例代码中省略了这一点。
推荐阅读
- selenium-webdriver - sauceLabs 上的 webdriverIO 测试不适用于 Firefox
- r - Caret 包的置信区间
- moodle - Moodle 主页只有纯文本,没有主题
- php - echo php 正在转换为 ascii
- xsd - 创建一个支持 web.config 转换或多租户/配置 xml 文件之类的 XSD
- reactjs - 如何在 React 重新渲染中重用 DOM 节点?
- java - aws cognito 中的分页获取用户
- react-native - 在 React Native 中使用类和渲染 api 调用
- python - 如何在Pygame中画一个小角度低速闪烁的运动圆圈?
- amazon-web-services - 使用 Amazon Cognito 进行手动身份验证