簡體   English   中英

C將stdout恢復到終端

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

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