點我查看祕籍連載函數
用戶進程工做在用戶態,它是受限的,不少涉及到硬件的操做都沒法執行,可是它們又想要取得結果,就只能請求工做在內核態的操做系統幫助完成這些操做,並將操做結果交給用戶進程。操作系統
系統調用(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