Linux 標準 輸入 輸出 重定向. printf 不輸出到螢幕的解決辦法
阿新 • • 發佈:2019-02-11
方法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. 這樣是為了提高效率.