本期主题:
unix环境高级编程——UNIX体系架构
文件IO
- 0.初始UNIX
- 1.系统调用
- 2.库函数
- 3.shell
0.初始UNIX
这里略过unix的历史不讲,网上有比较详细的资料。
我们可以将操作系统定义为一种软件 ,这种软件所做的事情包括控制计算机各种硬件资源,提供应用程序的运行环境,通常这种软件被称为内核(kernel)。
整体的系统架构图如下所示:
内核的接口被称为系统调用
公用函数库构建在系统调用之上
应用程序既可以使用公用函数库,也可以是使用系统调用
shell是一个特殊的应用程序,为运行其他应用程序提供了接口
/dev目录中的设备文件的用法都是相同的,它们都可以被打开、读、写和关闭。
下面是用于访问设备驱动程序的底层函数(系统调用)。
- open:打开文件或设备
- read:从打开的文件或设备里读数据
- write:向文件或设备写数据
- close:关闭文件或设备
- ioctl:把控制信息传递给设备驱动程序。
针对底层硬件的输入输出,频繁的使用系统调用效率会非常低,原因在于:
- 操作系统需要频繁的从 用户态 切换到 内核态,减少这种开销的一个好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。
- 硬件本身的特性决定,例如,磁带机通常一次能写的数据块长度是10k。所以,如果你试图写的数据量不是10k的整数倍,磁带机还是会以10k为单位卷绕磁带,从而在磁带上留下了空隙。
因此为了给设备和磁盘文件提供更高层的接口,Linux发行版(和UNIX)提供了一系列的标准函数库。
它们是一些由函数构成的集合,你可以把它们应用到自己的程序中,比如提供输出缓冲功能的标准I/O库。
你可以高效地写任意长度的数据块,库函数则在数据满足数据块长度要求时安排执行底层系统调用。这就极大降低了系统调用的开销。
以下就是常用的标准I/O库函数
- fopen、fclose
- fread、fwrite
- fflush
- fseek
- fgetc、getc、getchar
- fputc、putc、putchar
- fgets、gets
- printf、fprintf和sprintf
- scanf、fscanf和sscanf
shell是一个用户可以跟操作系统交互的可视化终端,它允许用户向操作系统输入需要执行的命令,这点与Windows的命令提示符类似,但是功能更为强大。
在Linux中安装多个shell是完全可行的,用户可以挑选一种自己喜欢的shell来使用。
下图显示了shell(实际上是两种shell:bash和csh)和其他程序环绕在Linux内核的四周。
在Linux系统中,默认总是作为/bin/sh安装的标准shell是GNU工具集中的bash(GNU Bourne-Again Shell)。



