簡體   English   中英

Linux dup2和printf

[英]linux dup2 and printf

我正在嘗試使用dup2重定向標准輸出到另一個文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
  int newfd;
  if ((newfd = open("output_file.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644)) < 0) {
    exit(1);
  }
  printf("Luke, I am your...\n");
  dup2(newfd, 1);
  printf("Foobar.\n");
  return 0;
}

當第一個printf打印換行符\\nLuke, I am your...將被打印到屏幕上,並且Foobar將被寫入到output_file.txt中 ,如果第一個printf不打印換行符printf("Luke, I am your..."); ,這兩個字符串都將被寫入output_file.txt。 因此,當沒有換行符( \\n )時,printf似乎會將第一個字符串寫入緩沖區。

那到底發生了什么呢?

原因是當您沒有換行符\\n ,將緩沖由printf()打印的字符串。 因此,緩沖區的全部內容都將打印到文件中。 這與第二次調用printf()無關。

如果您不使用fflush(stdout); 第一后printf()你不會看到這種行為,不論你是否有新行'\\n在第一個printf()或沒有。 因為fflush()將清除(刷新)所有緩沖的輸出,直到該點為止。

printf()中使用\\n似乎可以正常工作的原因是因為printf()在連接到終端設備時是行緩沖的。 因此, \\n觸發刷新。

當FD在其下方切換時,第一個字符串仍將緩沖在FD中。 如果需要在切換之前確保FD已清除,請先調用fflush(stdout)

暫無
暫無

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

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