首页 > 解决方案 > 将输出重定向回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,而不是终端。

标签: cshellposix

解决方案


关闭所有副本后,您将无法取回原始标准输出。

通常,如果您要执行另一个具有重定向输出的程序,您首先fork()是一个子程序,然后仅在子程序中应用重定向,然后如果执行失败,则让子程序立即终止。父母的流不受影响,因此无需恢复它们。这就是 shell 在运行外部命令时所做的事情。

但是要回答提出的问题,如果您希望能够重定向标准输出然后再恢复它,您需要先复制它...

int stdout_save = dup(STDOUT_FILENO);

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

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

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


推荐阅读