[英]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.