[英]C restore stdout to terminal
我正在使用多線程程序。
首先,我將我的stdout重定向到某個文件。 沒問題(我使用了dup2(fd, 1)
,其中fd
是文件的文件描述符)。
之后,我需要再次將我的標准輸出重定向到終端。
我的第一個方法:
/*Declaration*/
fpost_t stream_sdout;
/*code*/
if ( fgetpos( stdout, &stream_sdout) == -1 )
perror(Error:);
它說非法尋求。
不知道為什么會這樣。
但是,如果我讓它工作,那么我只需要使用fsetpos(stdout, &stream_stdout)
,它應該工作。
我的第二個想法是使用dup2(stdout, 4)
將dup2(stdout, 4)
復制到位置4的文件描述符表。但是這也不起作用。
如何將標准輸出切換回其原始目標(終端,管道,文件等)?
#include <unistd.h>
...
int saved_stdout;
...
/* Save current stdout for use later */
saved_stdout = dup(1);
dup2(my_temporary_stdout_fd, 1);
... do some work on your new stdout ...
/* Restore stdout */
dup2(saved_stdout, 1);
close(saved_stdout);
在執行dup2(fd, STDOUT_FILENO)
,應該通過執行int saved_stdout = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO)
來保存標准輸出的當前打開文件描述符int saved_stdout = dup(STDOUT_FILENO);
(讓dup()
為你選擇一個可用的文件描述符號)。 然后,在完成重定向到文件的輸出后,可以執行dup2(saved_stdout, STDOUT_FILENO)
將標准輸出恢復到啟動所有這些之前的位置(您也應該關閉saved_stdout
)。
你需要擔心在適當的時候沖洗標准的I / O流( fflush(stdout)
)。 這意味着'在你將stdout切換之前'。
如果程序在Linux環境中運行,則可以使用freopen ("/dev/stdout", "a", stdout)
。
但是如果你知道stdout
是終端, freopen ("/dev/tty", "a", stdout)
或其他操作系統的等價物 - 甚至是Windows。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.