歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 《APUE》:對各個標准I/O流打印緩沖狀態

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

日期:2017/3/1 10:12:04   编辑:Linux編程

《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. void pr_stdio(const char *, FILE *);
  8. int main(void)
  9. {
  10. FILE *fp;
  11. fputs("enter any character\n", stdout);
  12. if( getchar() == EOF )
  13. {
  14. fprintf(stderr, "Getchar error\n");
  15. exit(1);
  16. }
  17. fputs("one line to standard error\n", stderr);
  18. pr_stdio("stdin", stdin);
  19. pr_stdio("stdout", stdout);
  20. pr_stdio("stderr", stderr);
  21. //我的系統上找不到/etc/motd這個文件,所以用一個普通的txt文件代替
  22. fp = fopen("output.txt", "r");
  23. if( NULL == fp )
  24. {
  25. fprintf(stderr, "fopen error\n");
  26. exit(1);
  27. }
  28. if( EOF == getc(fp) )
  29. {
  30. fprintf(stderr, "getc error\n");
  31. exit(1);
  32. }
  33. pr_stdio("output.txt", fp);
  34. return 0;
  35. }
  36. void pr_stdio(const char *name, FILE *fp)
  37. {
  38. printf("stream = %s, ", name);
  39. if( fp->_IO_file_flags & _IO_UNBUFFERED )
  40. printf("unbuffered");
  41. else if( fp->_IO_file_flags & _IO_LINE_BUF )
  42. printf("line buffered");
  43. else
  44. printf("fully buffered");
  45. printf(", buffer size = %d\n",
  46. fp->_IO_buf_end - fp->_IO_buf_base);
  47. }

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

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