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