3.1节看得有点懵,暂时没仔细看
3.2 库函数
库函数相当于是系统调用的上一层,不过只有部分库函数会调用系统调用
- 不调用系统调用的库函数:字符串操作函数(strstr,strchr…)
- 调用系统调用的库函数:fopen()->open(), printf()->write(), malloc(), free()->brk()…
往往,设计库函数是为了提供比底层系统调用更为方便的调用接口
3.3 标准C 函数库
GUN C语言函数库是linux上最常用的实现(glibc)
3.4 处理来自系统调用和库函数的错误
系统调用的错误:
要了解调用是否成功,必须坚持对状态值进行检查。
通常,返回值为-1表示出错
系统调用失败时,会将全局变量error设置为一个正值,以标识具体的错误。
少数系统调用在调用成功时,也会返回-1(如getpriority)
提供库函数perror()和strerror(),根据errno值打印错误信息。
perror的简单使用:
strerror()会针对其errnum参数中所给定的错误号,返回相应的错误字符串。
库函数的错误:
从错误处理的角度来说,可将库函数划分为以下几类。
- 某些库函数返回错误信息的方式与系统调用完全相同----(返回-1,伴之以errno),如remove->unlink/rmdir
- 某些会返回-1之外的其他值,但仍会设置errno(如fopen出错会返回一个NULL指针)
- 还有些根本不使用errno
3.5 书中示例 略
3.6 可移植性问题
第一节,看不懂=-=
系统数据类型:
总而言之,为了避免可以执行问题,SUSv3规范了各种标准系统数据类型
标准系统数据类型中的大多数,其命名均以_t结尾。其中的许多都声明与头文件<sys/types.h>中,余下少量则定义与其他头文件中
其他可移植性问题,感觉目前不会遇到,二刷时候再看好了…
3.7 总结
哪怕是最简单的系统调用都会产生显著的开销,其原因是为了执行系统调用,系统需要临时切换到内核态,此外内核还需要验证系统调用的参数,用户内存和内核之间也有数据需要传递。
…其他的都说过了