9.3系统调用和高级编程语言的移植性
操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(svstem)的功能进行调用(call)的意思。在前面的程序中用到了 time()及 printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在 Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的函数名,并不是time()和 printf()。系统调用是在 time()和 printf()函数的内部执行的。大家可能会认为这个方法有些绕,不过这是有原因的。
C语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是 Windows 还是 Linux,都能使用几乎相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码(图9-6)。
在高级编程语言中,也存在可以直接调用系统调用的编程语言。不过,利用这种方式做成的应用,移植并不友好(也俗称为有恶意行为的应用)。例如,直接调用Windows系统调用的应用,在Linux上显然是无法运行的。