UNIX环境高级编程笔记之标准I/O库

简介: 一、总结   文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O。不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的。不带缓冲的I/O通过文件描述符的方式来引用一个文件,而带缓冲的I/O则通过文件流(stream)的方式来引用文件。

一、总结

  文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O。不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的。不带缓冲的I/O通过文件描述符的方式来引用一个文件,而带缓冲的I/O则通过文件流(stream)的方式来引用文件。至于为什么要用流的方式,原因就是带缓冲区,这样文件的读写就要经过缓冲区做缓冲,就像水流一样。

  引入标准IO库的目的是为了提高IO的效率,避免频繁的进行read/write系统调用,而系统调用会消耗较多的资源。因此标准IO库引入了IO缓存,通过累积一定量的IO数据后,然后集中写入到实际的文件中来减少系统调用,从而提高IO效率。标准IO库会自动管理内部的缓存,不需要程序员介入。然而,也正是因为我们看不到标准IO库的缓存,有时候会给我们带来一定的迷惑性。

  缓冲区的类型分为三种:

1)全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作,对于磁盘上的文件通常是由标准I/O库实施全缓冲的,在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc等函数来获得所需的缓冲区。

2)行缓冲:这种情况下,当在输入输出中遇到换行符时,标准I/O库执行I/O操作,因此,当涉及终端设备交互时,才使用行缓冲。

3)不带缓冲:即标准I/O库不对字符进行缓冲存储,那么这种情况就直接调用的是read、write等系统调用函数。这种情况一般用在需要对输入输出及时响应的情况下,如标准出错流stderr通常是不带缓冲的。

二、看图说话

目录
相关文章
|
10月前
|
Unix Linux C语言
计算机操作系统实验一 Unix/Linux编程开发环境
计算机操作系统实验一 Unix/Linux编程开发环境
96 0
|
6月前
|
Unix Shell Python
unix高级编程-fork和execve
unix高级编程-fork和execve
27 0
|
6月前
|
Ubuntu Unix Shell
unix高级编程-fork之后父子进程共享文件
unix高级编程-fork之后父子进程共享文件
34 0
|
6月前
|
Unix Linux
unix高级编程-僵尸进程和孤儿进程
unix高级编程-僵尸进程和孤儿进程
37 0
|
12月前
|
Unix Linux Shell
Unix/Linux环境使用(基础篇)(五)
Unix/Linux环境使用(基础篇)(五)
|
12月前
|
网络协议 安全 Ubuntu
Unix/Linux环境使用(基础篇)(四)
Unix/Linux环境使用(基础篇)(四)
|
Unix
《unix环境高级编程》 读书笔记 (9)
目录: http://blog.csdn.net/alex_my/article/details/39346381 signals 1 signal concepts 信号是一种软中断,可以由以下情形触发: -1: 用户按下某些终端键,例如ctrl + D -2: 硬件异常,例如除数为0,无效的内存引用 -3:kill(2), kill(1) -4:
942 0
|
Unix
《unix环境高级编程》 读书笔记 (8)
目录: http://blog.csdn.net/alex_my/article/details/39346381 process control 1 exec functions #include <unistd.h> extern char** environ; int execl(const char* path, const c
1159 0
|
机器学习/深度学习 Unix
《unix环境高级编程》 读书笔记 (7)
目录: http://blog.csdn.net/alex_my/article/details/39346381 process control 1 process identifiers 每一个进程都有一个唯一的非负整型做为标识符。 #include <unistd.h> pid_t getpid(); pid_t getppi
1083 0
|
Unix C++
《unix环境高级编程》 读书笔记 (6)
目录: http://blog.csdn.net/alex_my/article/details/39346381 process environment 1 exit, _exit, _Exit and atexit 在解释前三个之前先说说这个: #include <stdlib.h> i
1040 0