第6章 Linux系统调用 计算机学院潘薇 panweil17@qg.com
第6章 Linux系统调用 计算机学院 潘 薇 panwei117@qq.com
本章要点 61 Linux系统调用概述 62文件系统类系统调用 63进程类系统调用 6.4内存管理类系统调用 65其他常见系统调用
本章要点 ❖6.1 Linux系统调用概述 ❖6.2 文件系统类系统调用 ❖6.3 进程类系统调用 ❖6.4 内存管理类系统调用 ❖6.5 其他常见系统调用
61 Linux系统调用概述
6.1 Linux系统调用概述
61 Linux系统调用概述 系统调用是 Linux操作系统内核提供给用户程序的接口; 应用程序通过该接口使用系统资源 如果没有系统调用,应用程序失去内核的支持,也无法利 用内核提供的系统资源
6.1 Linux系统调用概述 ❖ 系统调用是Linux操作系统内核提供给用户程序的接口; ❖ 应用程序通过该接口使用系统资源; ❖ 如果没有系统调用,应用程序失去内核的支持,也无法利 用内核提供的系统资源
61 Linux系统调用概述 系统调用主要分为如下几类: 文件系统控制类; 文件系统操作类; 进程控制类; 操作系统控制类; 内存管理类; 网络管理类; Socket控制类; 用户管理类; 进程间通信类
系统调用主要分为如下几类: ❖ 文件系统控制类; ❖ 文件系统操作类; ❖ 进程控制类; ❖ 操作系统控制类; ❖ 内存管理类; ❖ 网络管理类; ❖ Socket控制类; ❖ 用户管理类; ❖ 进程间通信类。 6.1 Linux系统调用概述
61 Linux系统调用概述 系统调用是一种函数调用,与一般的函数调用相比,在表 现方式上和实现效果上有明显不同: 表现方式上的不同:一般函数调用时直接由调用过程转向 被调用过程;而系统调用不允许由调用过程直接转向被调 用过程,要借助于信号(软中断),先进入系统内核,再 转向相应的系统调用。 不能进入操作系统内核空间;而系统调用需要从用户空间 切换到内核空间,并在内核空间下进行。由于内核空间处 于保护模式下,更加安全。因此,通过系统调用方式提供 给应用程序使用内核资源不但更加安全,而且优先级高, 响应速度快,效率高
❖ 系统调用是一种函数调用,与一般的函数调用相比,在表 现方式上和实现效果上有明显不同: ❖ 表现方式上的不同:一般函数调用时直接由调用过程转向 被调用过程;而系统调用不允许由调用过程直接转向被调 用过程,要借助于信号(软中断),先进入系统内核,再 转向相应的系统调用。 ❖ 实现效果上的不同:一般函数调用一直在用户空间上进行, 不能进入操作系统内核空间;而系统调用需要从用户空间 切换到内核空间,并在内核空间下进行。由于内核空间处 于保护模式下,更加安全。因此,通过系统调用方式提供 给应用程序使用内核资源不但更加安全,而且优先级高, 响应速度快,效率高。 6.1 Linux系统调用概述
61 Linux系统调用概述 用户应用程序 冮链接库函数 用户态 系统调用 核心态 文件子系统 进程控制子系统 硬设备控制系统 硬件 硬件 图6.1 linux调用
6.1 Linux系统调用概述 用户应用程序 链接库函数 用户态 系统调用 核心态 文件子系统 进程控制子系统 硬设备控制系统 硬件 硬件 图6.1 linux调用
61 Linux系统调用概述 在C语言中存在一系列链接库,在链接库中含有一系列函 数调用,如链接库 stdio. h中含有标准输入、输出操作的 fopen、 fclose, fread、 fwrite、 fseek、ftel等, 用户应用程序调用这些链接库函数。这些函数位于操作系 统之上,需要通过系统调用才能和操作系统内核取得联系
❖ 在C语言中存在一系列链接库,在链接库中含有一系列函 数调用,如链接库stdio.h中含有标准输入、输出操作的 fopen、fclose,fread、fwrite、fseek、ftell等, 用户应用程序调用这些链接库函数。这些函数位于操作系 统之上,需要通过系统调用才能和操作系统内核取得联系。 6.1 Linux系统调用概述
6.1 Linux系统调用概述 ◇链接库函数是高层的,完全运行在用户空间,是为程序员 提供调用系统调用的更方便的接口。 系统调用在内核态运行并且由内核自己提供。 部分标准C函数不使用系统调用,如 strlen, strcat, memcpy等等。因为他们不需要使用到系统相关资源。 标准C库函数 printf(可以被看做是一个通用的输出语句, 但它实际做的是将数据转化为符合格式的字符串并且调用 系统调用 write(输出这些字符串
6.1 Linux系统调用概述 ❖ 链接库函数是高层的,完全运行在用户空间,是为程序员 提供调用系统调用的更方便的接口。 ❖ 系统调用在内核态运行并且由内核自己提供。 ❖ 部分标准C函数不使用系统调用,如strlen, strcat, memcpy等等。因为他们不需要使用到系统相关资源。 ❖ 标准C库函数printf()可以被看做是一个通用的输出语句, 但它实际做的是将数据转化为符合格式的字符串并且调用 系统调用write()输出这些字符串
6.1 Linux系统调用概述 t include int main (void) printf( hello i return o 使用命令gcc-Wal- o helo hello.c编译。 用命令 strace·/ hello跟踪该可执行文件。输出的结 果每一行都和一个系统调用相对应。 strace是一个非常 有用的程序,它可以告诉你程序使用了哪些系统调用和这 些系统调用的参数、返回值。 其中有这么一行: write(1, hello!",hello!) =6
6.1 Linux系统调用概述 ❖ #include int main(void) { printf("hello"); return 0; } ❖ 使用命令gcc -Wall -o hello hello.c编译。 ❖ 用命令 strace ./hello 跟踪该可执行文件。输出的结 果每一行都和一个系统调用相对应。 strace是一个非常 有用的程序,它可以告诉你程序使用了哪些系统调用和这 些系统调用的参数、返回值。 ❖ 其中有这么一行: ❖ write(1, "hello!", 6hello!) = 6