《APUE》:对各个标准I/O流打印缓冲状态


《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu 10.04上测试通过。

相关链接

  • 《UNIX环境高级编程》(第二版)apue.h的错误
  • Unix环境高级编程 源代码地址
  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.bkjia.com @ubuntu:~/code$ gcc temp.c -o temp
www.bkjia.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.bkjia.com @ubuntu:~/code$ ./temp < output.txt > std.out 2>std.err
www.bkjia.com @ubuntu:~/code$ cat std.err
one line to standard error
www.bkjia.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长度;还有,标准出错是非缓冲的,而普通文件被系统默认是全缓冲的。

相关内容