第三章 系统编程概念
1、系统调用的概念:
用户通过系统调用来进入到linux内核中,可以利用应用程序编程接口(API)的形式来访问系统提供的服务。其中包括创建新的进程、执行I/O、为进程间通信创建管道等。
2、用户态进行系统调用情况:
用户通过调用glibc库中的外壳函数来发起系统调用。
外壳函数会将系统调用所需参数传入到特定的寄存器內;系统调用进入内核的方式都是一样的。
内核为了区分要调用哪一个系统操作,所以使得外壳函数将需要使用的系统调用编号也要存放到相应的cpu寄存器中(%eax)。
系统调用完毕会返回给外壳函数一个值来表明调用结果,然后外壳函数利用返回值来设置全局变量errno。然后,外壳函数会返回调用程序,并返回一个整型值来表明系统调用是否成功。
在linux上,系统调用的惯例是调用成功返回非负值。发生错误时,将相对应的errno常量取反再返回。外壳函数会对其再次取反,并将结果拷贝到errno中,同时以-1作为外壳函数的返回值返回,向调用程序表明有错误发生。
系统调用的开销小,但系统在用户态与核心态之间的切换耗时较长,不如直接使用库函数。
3、库函数:
库函数有的可以不使用任何系统调用,而有的则建立在系统调用之上。例如,库函数fopen()就利用系统调用open()来执行打开文件的实际操作。标准c语言函数库:glibc。在ubuntu上可以使用 ldd –version 来查看自己的glibc版本号。
4、处理错误:
几乎每个系统调用和库函数都会返回某类状态值,用来表明调用是否成功。要了解调用是否成功,必须要对状态值进行