16-总结
3.7 总结
系统调用允许进程向内核请求服务。与用户空间的函数调用相比,哪怕是最简单的系统调用都会产生显著的开销,其原因是为了执行系统调用,系统需要临时性地切换到核心态,此外,内核还需验证系统调用的参数、用户内存和内核内存之间也有数据需要传递。
标准的C语言函数库提供了大量库函数,功能五花八门。有些库函数会利用系统调用来完成工作,而另一些库函数则完全在用户空间内执行任务。在Linux上,一般情况下,使用glibc作为C语言标准库的实现。
大多数系统调用和库函数都会返回一个状态值,以表明调用成功与否。对这一返回状态进行检查是一条编程铁律。
为本书的程序示例还实现有一批函数。其所执行的任务包括诊断错误和解析命令行参数。
本章也提供了一系列指南及技术,以帮助读者编写可移植的系统程序,此类程序可在任何符合标准的系统上运行。
编译应用程序时,可定义不同的特性测试宏,以控制头文件显露对特定标准的定义。当希望确保程序符合某些正式或由实现定义的标准时,上述做法可谓是非常实用。
利用定义于各个标准中(而非原生C语言类型)的系统数据类型,能够改善系统编程的可移植性。SUSv3定义有大量系统数据类型,UNIX实现应加以支持,应用程序应予以采用。