将输出重定向回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);

然后执行重定向。当准备好恢复时,只需将保存的文件描述符复制回,然后关闭重复。

dup2(stdout_save, STDOUT_FILENO);
close(stdout_save);

不要忽视对这些函数调用的返回值进行适当的检查;为了简洁明了,我在示例代码中省略了这一点。

最新更新