验证stderr stdout stdin 缓冲类型和缓冲区大小 以及在重定向后缓冲类型的改变

stdin 和stdout在重定向后缓冲类型有line buffered变为full buffered。

大小因os而已。在SunOs上为1024.

<bldc:/home/tingbinz/apue.3e/SBSCODE/5>R*_*G:uname -a
SunOS bldc 5.8 Generic_Virtual sun4u sparc SUNW,Netra-T12

一、源代码:

 1 #include "apue.h"
  2
  3 void pr_stdio(const char *,FILE *fp);
  4 int is_unbuffered(FILE *fp);
  5 int is_linebuffered(FILE *fp);
  6 int buffer_size(FILE *fp);
  7
  8 int main()
  9 {
 10         FILE *fp;
 11         fputs("enter any character\n",stdout);
 12         if (getchar() == EOF)
 13                 err_sys("getchar error");
 14         fputs("flash stderror\n",stderr);
 15
 16         pr_stdio("stdout",stdout);
 17         pr_stdio("stdin",stdin);
 18         pr_stdio("stderr",stderr);
 19
 20         if ((fp = fopen("/etc/passwd","r")) == NULL)
 21                 err_sys("fopen error");
 22         if (getc(fp) == EOF)
 23                 err_sys("getc error");
 24         pr_stdio("/etc/passed",fp);
 25
 26         exit(0);
 27 }
 28
 29 void pr_stdio(const char *name, FILE *fp)
 30 {
 31         printf("stream = %s, ",name);
 32         if (is_unbuffered(fp))
 33                 printf("unbuffered");
 34         else if (is_linebuffered(fp))
 35                 printf("line buffered");
 36         else
 37                 printf("full buffered");
 38         printf(", buffer size = %d\n", buffer_size(fp));
 39 }
 41 #if defined(_IO_UNBUFFERED)
 42 int is_unbuffered(FILE *fp)
 43 {
 44         return (fp->flags & _IO_LINE_BUF);
 45 }
 46
 47 int is_linebuffered(FILE *fp)
 48 {
 49         return (fp->flags & _IO_UNBUFFERED);
 50 }
 51
 52 int buffer_size(FILE *fp)
 53 {
 54         return (fp->_IO_buf_end - _IO_buf_base);
 55 }
 56 #elif defined (_SNBF)
 57 int is_unbuffered(FILE *fp)
 58 {
 59         return (fp->flags & _SNBF);
 60 }
 61 int is_linebuffered(FILE *fp)
 62 {
 63         return (fp->flags & _SLBF);
 64 }
 65 int buffer_size(FILE *fp)
 66 {
 67         return (fp->_bf._size);
 68 }
 69
 70 #elif defined (_IONBF)
 71
 72 #ifdef _LP64
 73 #define _flag_pad[4];
 74 #define _ptr_pad[1];
 75 #define _base_pad[2];
 76 #endif
 77
 78 int is_unbuffered(FILE *fp)
 79 {
 80         return (fp->_flag & _IONBF);
 81 }
 82
 83 int is_linebuffered(FILE *fp)
 84 {
 85         return (fp->_flag & _IOLBF);
 86 }
 87
 88 int buffer_size(FILE *fp)
 89 {
 90 #ifdef _LP64
 91         return(fp->_base - fp->ptr);
 92 #else
 93         return (BUFSIZ);
 94 #endif
 95 }
 96
 97 #else
 98
 99 #error unknown stdio implementation!
100
101 #endif

二、运行结果:

<bldc:/home/tingbinz/apue.3e/SBSCODE/5>R*_*G:./buffer_size_type
enter any character
hello
flash stderror
stream = stdout, line buffered, buffer size = 1024
stream = stdin, line buffered, buffer size = 1024
stream = stderr, unbuffered, buffer size = 1024
stream = /etc/passed, full buffered, buffer size = 1024
<bldc:/home/tingbinz/apue.3e/SBSCODE/5>R*_*G:./buffer_size_type </etc/group >out.txt 2>err.txt
<bldc:/home/tingbinz/apue.3e/SBSCODE/5>R*_*G:cat out.txt
enter any character
stream = stdout, full buffered, buffer size = 1024
stream = stdin, full buffered, buffer size = 1024
stream = stderr, unbuffered, buffer size = 1024
stream = /etc/passed, full buffered, buffer size = 1024
<bldc:/home/tingbinz/apue.3e/SBSCODE/5>R*_*G:cat err.txt
flash stderror

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值