簡體   English   中英

將輸出重定向回 C 中的終端

[英]Redirect output back to terminal in 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()一個子程序,並僅在子程序中應用重定向,然后在 exec 失敗時立即終止子程序。 父級的流不會以這種方式受到影響,因此無需恢復它們。 這就是 shell 在運行外部命令時所做的事情。

但是要回答提出的問題,如果您希望能夠重定向標准輸出然后再恢復它,您需要先制作一個副本......

int stdout_save = dup(STDOUT_FILENO);

然后執行您的重定向。 准備好恢復時,只需將保存的文件描述符復制回來,然后關閉欺騙。

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

不要忽視對這些函數調用的返回值進行適當的檢查; 為了清晰和簡潔,我在示例代碼中省略了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM