UNIX环境高级编程:第一章(UNIX基础知识)
1.1引言
所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序、打开文件、读写文件、分配存储空间、提供时间等。
1.2UNIX体系架构
严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程序运行环境。这种软件有个专业术语名称:内核。因为它小且位于计算机体系的核心。
公用函数库通常指的是C/C++的标准库,例如libc、glibc、libstdc++、libc++等标准库,不同的标准库是由于不同的系统平台或编译器厂商造成的差异,但追根究底都是使用了底层系统内核的API接口系统调用。这些公用函数库极大的方便了上层开发者的使用,也是整个计算机软件体系(无论任何编程语言)的基础。
1.3登陆
- 口令文件:/etc/passwd:依次是:登录名、加密口令、数字用户ID、组ID、注释字段、起始目录、shell程序
2.shell
hell也是一个软件,该软件负责人机交互,用户和shell进行“对话”,然后shell理解用户的意图来使计算机按用户的想法工作。比如我们使用ls命令告诉shell我们想查看文件夹,shell接收后使用各种底层功能(包括读写文件系统、IO输入输出等)来完成该工作,当然最终的结果是打印文件夹在我们的屏幕上显示给我们看。
1.4文件和目录
文件系统
UNIX文件系统是一直树形层次结构,有一个根,是最根本的起点,它是“/”。在文件系统中,目录本质上也是一个文件,其内容是目录项的记录。每个目录项都是一个文件名,还包含一些文件属性的说明信息,比如权限、大小、时间等。
文件名
空格符 和 / 不能出现在文件名中。 .指向当前目录 ..指向父目录 在根目录中,两者的作用相同。
路径名
绝对路径absolute pathname 和 相对路径relative pathname 文件系统根的目录 /
实例:
man (+ num):
1、Standard commands (标准命令)
2、System calls (系统调用)
3、Library functions (库函数)
4、Special devices (设备说明)
5、File formats (文件格式)
6、Games and toys (游戏和娱乐)
7、Miscellaneous (杂项)
8、Administrative Commands (管理员命令)
//这是在UNIX环境,linux环境还需要改进。
1.5输入和输出
1.文件描述符
2.标准输入、标准输出、标准出错
3.不带缓冲的IO
实例:从标准输入然后从标准输出,可用于复制任意普通文件。
4.标准IO
1.6程序和进程
进程控制的实例:
1.7出错处理
出错恢复
1.8用户标识
ID
1.9信号
1.10时间值
1.11系统调用和库函数
系统调用指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。
为什么用户程序不能直接访问系统内核提供的服务呢?这是由于在Linux中,为了更好地保护内核空间,将程序的运行空间分为用户空间和内核空间(也就是常称的用户态和内核态),它们分别运行在不同的级别上,逻辑上是相互分离的。因此,用户进程通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。
但是,在有些情况下,用户空间的进程需要获得一定的系统服务(调用内核空间程序),这时操作系统就必须利用系统提供用户的“特殊接口”———系统调用规定用户进程进入内核空间的具体位置。在进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完成后再返回用户空间。
Linux系统调用还算精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。
用户编程接口(API)
前面讲到的系统调用并不直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。实际使用中,程序员调用的通常都是用户编程接口(API)。
例如,创建进程的API函数fork()函数对应于内核空间的sys_fork()系统调用,但并不是所有的函数都对应一个系统调用。有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些API函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。
习题: