点我查看秘籍连载函数
用户进程工做在用户态,它是受限的,不少涉及到硬件的操做都没法执行,可是它们又想要取得结果,就只能请求工做在内核态的操做系统帮助完成这些操做,并将操做结果交给用户进程。操作系统
系统调用(system call)就是操做系统提供给用户进程请求操做系统作一些特权操做的接口,即为用户进程提供服务的窗口。在Linux下能够经过man syscalls
命令查看Linux提供的全部系统调用。code
理解系统调用其实很简单,好比有一个程序想要读取a.log文件(例如head -n 1 a.log
),读取以前必须先打开文件,可是用户进程是没有权限打开文件的,因此用户进程只能发送一个open()的系统调用请求操做系统去帮忙打开这个文件,操做系统打开这个文件后会将打开的结果——文件描述符交给用户进程,用户进程经过这个文件描述符就能去操做这个文件。再进一步,用户进程想要从这个打开的文件中读取一行数据,用户进程是没有权限读取文件的,只能发送一个read()系统调用请求操做系统去读取这一行数据,操做系统读取这行数据后就能交给用户进程。blog
不难发现,系统调用open()和read()都像是函数。其实它们确实都是函数,只不过是比较特殊的由操做系统提供的,通常是由汇编语言编写或参杂了部分汇编代码,由于它们要和硬件交互。接口
对于非C程序,其实本质仍是同样的。好比CPython,也有open()函数,它是对C库函数open()的再次封装。因此,在Python程序中调用open()方法打开文件,实际上是调用C库的open()函数,再经过open()库函数发起系统调用请求操做系统打开文件,并将结果交给Python程序。进程
最后,结合前面介绍的中断概念,描述下发起系统调用后的主要过程:get