1 -1 本文是Linux 系统调用系列文章的第一篇,对Linux 系统调用的定义、基本原理、使用方法和注意事项大概作了一个介绍,以便读者对Linux 系统调用建立一个大致的印象。 什么是系统调用? Linux 内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。二者在使用方式上也有相似之处,在下面将会提到。 随 Linux 核心还提供了一些 C 语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。 Linux 中共有多少个系统调用? 这个问题可不太好回答,就算让 Linus Torvaldz 本人也不见得一下子就能说清楚。 在 2.4.4 版内核中,狭义上的系统调用共有 221 个,你可以在<内核源码目录>/include/asm-i386/unistd.h中找到它们的原本,也可以通过命令"man 2 syscalls"察看它们的目录(man pages 的版本一般比较老,可能有很多最新的调用都没有包含在内)。广义上的系统调用,也就是以库函数的形式实现的那些,它们的个数从来没有人统计过,这是一件吃力不讨好的活,新内核不断地在推出,每一个新内核中函数数目的变化根本就没有人在乎,至少连内核的修改者本人都不在乎,因为他们从来没有发布过一个此类的声明。 随本文一起有一份经过整理的列表,它不可能非常全面,但常见的系统调用基本都已经包含在内,那里面只有不多的一部分是你平时用得到的,本专栏将会有选择的对它们进行介绍。 为什么要用系统调用? 实际上,很多已经被我们习以为常的C 语言标准函数,在 Linux 平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。进一步,若想成为一名 Linux 下编程高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。 即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。 系统调用是怎么工作的? 一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数...