歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

《APUE》:對各個標准I/O流打印緩沖狀態

《Unix環境高級編程》這本書附帶了許多短小精美的小程序,我在閱讀此書的時候,將書上的代碼按照自己的理解重寫了一遍(大部分是抄書上的),加深一下自己的理解(純看書太困了,呵呵)。此例子在Ubuntu 10.04上測試通過。

相關鏈接

  • 《UNIX環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
  • Unix環境高級編程 源代碼地址 http://www.linuxidc.com/Linux/2011-04/34826.htm
  1. //《APUE》:程序5-3   
  2. //對各個標准I/O流打印緩沖狀態   
  3. #include <stdio.h>   
  4. #include <unistd.h>   
  5. #include <libio.h>   
  6. #include <stdlib.h>   
  7.   
  8. void pr_stdio(const char *, FILE *);  
  9.   
  10. int main(void)  
  11. {  
  12.     FILE *fp;  
  13.     fputs("enter any character\n", stdout);  
  14.     if( getchar() == EOF )  
  15.     {  
  16.         fprintf(stderr, "Getchar error\n");  
  17.         exit(1);  
  18.     }  
  19.     fputs("one line to standard error\n", stderr);  
  20.   
  21.     pr_stdio("stdin", stdin);  
  22.     pr_stdio("stdout", stdout);  
  23.     pr_stdio("stderr", stderr);  
  24.   
  25.     //我的系統上找不到/etc/motd這個文件,所以用一個普通的txt文件代替   
  26.     fp = fopen("output.txt""r");  
  27.     if( NULL == fp )  
  28.     {  
  29.         fprintf(stderr, "fopen error\n");  
  30.         exit(1);  
  31.     }  
  32.     if( EOF == getc(fp) )  
  33.     {  
  34.         fprintf(stderr, "getc error\n");  
  35.         exit(1);  
  36.     }  
  37.     pr_stdio("output.txt", fp);  
  38.     return 0;  
  39. }  
  40.   
  41. void pr_stdio(const char *name, FILE *fp)  
  42. {  
  43.     printf("stream = %s,  ", name);  
  44.     if( fp->_IO_file_flags & _IO_UNBUFFERED )  
  45.         printf("unbuffered");  
  46.     else if( fp->_IO_file_flags & _IO_LINE_BUF )  
  47.         printf("line buffered");  
  48.     else  
  49.         printf("fully buffered");  
  50.     printf(", buffer size = %d\n",   
  51.         fp->_IO_buf_end - fp->_IO_buf_base);  
  52. }  

運行示例(加下劃線的為輸入):

www.linuxidc.com @ubuntu:~/code$ gcc temp.c -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
enter any character
(鍵入回車鍵)
one line to standard error
stream = stdin,  line buffered, buffer size = 1024
stream = stdout,  line buffered, buffer size = 1024
stream = stderr,  unbuffered, buffer size = 1
stream = output.txt,  fully buffered, buffer size = 4096
www.linuxidc.com @ubuntu:~/code$ ./temp < output.txt > std.out 2>std.err
www.linuxidc.com @ubuntu:~/code$ cat std.err
one line to standard error
www.linuxidc.com @ubuntu:~/code$ cat std.out
enter any character
stream = stdin,  fully buffered, buffer size = 4096
stream = stdout,  fully buffered, buffer size = 4096
stream = stderr,  unbuffered, buffer size = 1
stream = output.txt,  fully buffered, buffer size = 4096

結論:

從此可見,該系統默認的是:當標准輸入,輸出連終端時,它們是行緩沖的。行緩沖的長度是1024;當將這個流重定向到文件時,它們就變成全緩沖的,其緩沖區的長度是該文件系統優先選用的I/O長度;還有,標准出錯是非緩沖的,而普通文件被系統默認是全緩沖的。

Copyright © Linux教程網 All Rights Reserved