1. 程式人生 > >Linux 標準 輸入 輸出 重定向. printf 不輸出到螢幕的解決辦法

Linux 標準 輸入 輸出 重定向. printf 不輸出到螢幕的解決辦法

方法1:
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
 
 int main()
 {
     fflush(stdout);
     setvbuf(stdout,NULL,_IONBF,0);
     printf("test stdout\n");
     int save_fd = dup(STDOUT_FILENO); // 儲存標準輸出 檔案描述符 注:這裡一定要用 dup 複製一個檔案描述符. 不要用 = 就像是Winodws下的控制代碼.
     int fd = open("test1.txt",(O_RDWR | O_CREAT), 0644);
     dup2(fd,STDOUT_FILENO); // 用我們新開啟的檔案描述符替換掉 標準輸出
     printf("test file\n");
	 
	 //再恢復回來標準輸出. 兩種方式
	 //方法1 有儲存 標準輸出的情況
	 //dup2(save_fd,STDOUT_FILENO);
	 
	 //方法2 沒有儲存 標準輸出的情況
      int ttyfd = open("/dev/tty",(O_RDWR), 0644);
     dup2(ttyfd,STDOUT_FILENO);
     printf("test tty\n");
 }

 方法2:
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

 int main()
 {
     fflush(stdout);
     setvbuf(stdout,NULL,_IONBF,0);
     printf("test stdout\n");
     freopen("test1.txt","w",stdout); //注: 不要使用這類的程式碼 stdout = fopen("test1.txt","w");   這樣的話輸出很詭異的. 最好使用  freopen 這類的函式來替換它.
     printf("test file\n");
     freopen("/dev/tty","w",stdout);
     printf("test tty\n");
 }
到這裡我們就可以輕鬆解決 prinft  不輸出到螢幕的問題了.


不外乎兩種情況.  
第1 標準輸出被重定向了.
第2 輸出緩衝區的問題. 就是 我們上兩例中 開頭的兩行程式碼了.
 fflush(stdout); //  重新整理一下緩衝區 讓它馬上輸出.  在printf 之後呼叫它,就會馬上輸出了.
 setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上個方法麻煩, 就使用這個函式. 直接將緩衝區禁止了. 它就直接輸出了.
這兩個函式都是有關流緩衝區的. 具體使用和說明網上有很多.   我只說一下什麼是流緩衝區, 是做什麼用的.  作業系統為減少 IO操作 所以設定了緩衝區.  等緩衝區滿了再去操作IO. 這樣是為了提高效率.