《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。
//《APUE》:程序5-3
//对各个标准I/O流打印缓冲状态
#include <stdio.h>
#include <unistd.h>
#include <libio.h>
#include <stdlib.h>
void pr_stdio(const char *, FILE *);
int main(void)
{
FILE *fp;
fputs("enter any character\n", stdout);
if( getchar() == EOF )
{
fprintf(stderr, "Getchar error\n");
exit(1);
}
fputs("one line to standard error\n", stderr);
pr_stdio("stdin", stdin);
pr_stdio("stdout", stdout);
pr_stdio("stderr", stderr);
//我的系统上找不到/etc/motd这个文件,所以用一个普通的txt文件代替
fp = fopen("output.txt", "r");
if( NULL == fp )
{
fprintf(stderr, "fopen error\n");
exit(1);
}
if( EOF == getc(fp) )
{
fprintf(stderr, "getc error\n");
exit(1);
}
pr_stdio("output.txt", fp);
return 0;
}
void pr_stdio(const char *name, FILE *fp)
{
printf("stream = %s, ", name);
if( fp->_IO_file_flags & _IO_UNBUFFERED )
printf("unbuffered");
else if( fp->_IO_file_flags & _IO_LINE_BUF )
printf("line buffered");
else
printf("fully buffered");
printf(", buffer size = %d\n",
fp->_IO_buf_end - fp->_IO_buf_base);
}
运行示例(加下划线的为输入):
qch@ubuntu:~/code$ gcc temp.c -o temp
qch@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
qch@ubuntu:~/code$ ./temp < output.txt > std.out 2>std.err
qch@ubuntu:~/code$ cat std.err
one line to standard error
qch@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长度;还有,标准出错是非缓冲的,而普通文件被系统默认是全缓冲的。
更多详细信息请查看
java教程网 http://www.itchm.com/forum-59-1.html
分享到:
相关推荐
不带缓存的I/O不是ANSI C标准的一部分,但属于POSIX.1和XPG3标准,因此在UNIX和类UNIX系统中广泛使用。 【文件描述符】 文件描述符是内核用来标识已打开文件的非负整数。当使用`open`或`creat`函数打开或创建文件时...
相信很多初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例时就出现问题,提示 "错误:apue.h:没有那个文件或目录". apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出错处理函数。...
3. **文件系统和I/O**:涵盖了标准I/O库函数和低级I/O操作,如缓冲I/O、非阻塞I/O、异步I/O以及文件描述符和文件状态标志的管理。 4. **信号处理**:解释了信号的基本概念、信号的发送和接收、信号处理函数以及信号...
例如,如果你知道`apue.h`在`/opt/apue/include`,可以运行`ln -s /opt/apue/include/apue.h /usr/local/include/apue.h`。 4. **调整编译选项**:确保你的编译命令中包含了正确的头文件搜索路径。例如,使用`gcc`...
APUE(Advanced Programming in the UNIX Environment)是学习UNIX系统编程的经典著作,其中对标准I/O库的讨论虽然全面,但关于其缓存机制的解释可能过于简化,导致读者对标准I/O缓存的内部实现原理不够了解。...
3. **标准I/O库**:介绍了C语言的标准I/O库,包括`stdio.h`中的`printf()`、`scanf()`等函数,以及缓冲I/O和无缓冲I/O的区别。 4. **进程间通信(IPC)**:涵盖管道、信号量、消息队列、共享内存等多种进程间通信...
5. **标准I/O库**:分析C语言的标准输入/输出库(stdio.h),包括流式I/O和缓冲机制。 6. **文件系统接口**:如目录操作、文件权限、硬链接和软链接、文件系统挂载和卸载等。 7. **网络编程**:讲解套接字API,...
3. **I/O操作**:介绍了标准I/O库和低级I/O的区别,如read、write、select、poll等函数的使用,并讲解了缓冲I/O和非缓冲I/O的概念。 4. **网络编程**:深入剖析了套接字API,讲解了TCP/IP协议栈,包括服务器端和...
2. **文件I/O**:包括标准I/O库、低级I/O(open、read、write、close等)以及文件系统操作(如打开、关闭、重命名、链接和硬链接)。此外,还讲解了文件描述符、缓冲I/O和非阻塞I/O等高级特性。 3. **系统调用**:...
2. **文件I/O**:APUE中详细讲解了标准I/O库和低级I/O操作,如open、read、write、close、lseek等函数。测试代码会展示如何进行文件读写、文件定位、异步I/O以及错误处理。 3. **系统调用与库函数**:书中涵盖了...
在APUE.2E中,读者可以学习到标准I/O库的使用,如stdio.h中的函数,以及低级I/O(如read、write)和缓冲I/O。此外,书中还涵盖了文件描述符的重定向、管道、FIFO(有名管道)以及套接字等网络I/O。 三、进程间通信 ...
5. 标准I/O库:这部分内容是关于C语言中标准I/O库的使用,包括文件流的概念,标准输入输出流stdin、stdout和stderr,标准I/O的缓冲机制,文件流的打开、读写、关闭以及定位操作。还介绍了一些格式化输入输出函数以及...
10. **标准I/O库**:除了低级I/O操作,APUE还介绍了C语言的标准I/O库,如fopen、fprintf等函数的使用。 通过学习APUE 2e的源代码,你可以不仅限于理论,而是能够在实践中掌握这些知识,这对于成为一名优秀的UNIX/...
通过学习标准I/O库和低级I/O,开发者可以灵活地处理各种数据存储需求。 3. **系统调用与库函数**:讲解系统调用(如open、read、write)和C库函数(如fopen、fread、fwrite)的区别,以及何时选择使用它们。 4. **...
APUE涵盖了许多关键的Unix编程主题,包括进程管理、文件I/O、信号处理、系统调用接口、标准库函数、多线程编程、网络编程、内存管理和错误处理等。以下是对这些知识点的详细阐述: 1. **进程管理**:Unix系统中的...
源码可能涉及到缓冲I/O、非阻塞I/O、异步I/O的实现。 3. **信号处理**:信号是UNIX中进程间交互的一种方式,用于通知进程发生了某些事件,如SIGINT(中断)、SIGTERM(正常终止)等。`apue.2e`可能会包含如何注册...
2. **C语言编程**:书中详细讨论了在UNIX环境下使用C语言进行系统编程的细节,如标准I/O库、低级I/O、内存管理、错误处理等,帮助读者掌握如何有效地利用C语言特性来与操作系统交互。 3. **进程管理**:包括进程...
这个头文件通常包含了对标准C库中某些函数的重定义或扩展,以及针对APUE教程中讨论的特定实现的辅助宏和结构体。例如,它可能包含用于处理信号、进程间通信、文件描述符管理等方面的函数声明,这些都是Unix环境中...
6. **标准I/O库**:学习如何使用标准I/O库进行输入输出操作,如错误处理机制、流的概念。 7. **符号链接和硬链接**:了解`symlink()`和`link()`函数,以及它们在文件系统中的作用。 8. **网络编程**:包括套接字...