系统调用(system call)是操作系统为用户提供的服务接口。当应用程序或系统程序需要操作系统完成某项功能服务时,可通过系统调用将其需要的请求传至给内核,内核调用相应的内核函数完成所需的处理,并将处理结果返回给应用程序或系统程序。如果没有系统调用,用户将不可能编写出功能强大的应用程序或系统程序。从这个角度可以认为内核的主体是系统调用的集合,它是一组特殊的公共子程序。系统调用通常是由C和C++编写的例程,但某些低级任务(例如,必须直接访问硬件的任务)可能使用汇编语言指令编写。
一个程序在运行时会执行大量的系统调用,下面举一个简单的例子来说明。
例:读一个文本文件,将其输出,其C语言代码如下。
/* 文件名:disp.c*/#include #include int main(){
FILE *fp; char c; if ((fp=fopen("abc.txt","r"))==NULL) {
printf("File does not exist!\n"); exit(0); } while ((c=fgetc(fp))!=EOF) {
printf("%c",c); } fclose(fp); return 0;}
该程序读当前目录上的文件abc.txt,将其内容输出。假设abc.txt的内容为:abcdef,编译该程序,然后查看该程序运行时会执行哪些系统调用。
使用strace命令可以查看disp在运行时执行了哪些系统调用,在上图的命名中,-o disp.log选项可以将程序在运行过程中执行的系统调用记录在disp.log文件中。disp.log文件内容如下。
execve("./disp", ["./disp"], 0x7ffe09e1fde0 /* 63 vars */) &#