系統調用的目的是:請求系統服務。操作系統不允許用戶直接操作各種硬件資源,因此用戶程序只能通過系統調用的方式來請求內核為其服務,間接地使用各種資源。
由操作系統提供的功能,通常應用程序本身是無法實現的。例如對文件進行操作,應用程序必需通過系統調用才能做到,因為只有操作系統才具有直接管理外圍設備的權限。又如進程或線程間的同步互斥操作,也必需經由操作系統對內核變量進行維護才能完成。
從下到上看一個完整的計算機系統:物理硬件->OS內核->OS服務->應用程序。這里的OS內核起到了“承上啟下”的關鍵作用,向下管理物理硬件,向上為操作系統服務和應用程序提供接口,這里的接口就是系統調用了。
應用程序的進程通常在user模式下運行,當它調用一個系統調用時,進程進入kernel模式,執行的是kernel內部的代碼,從而具有執行特權指令的權限,完成特定的功能。換句話說,系統調用是應用程序主動進入操作系統內核的入口。
一、系統調用和庫函數的區別
庫函數
顧名思義是把函數放到庫里,是把一些常用到的函數編完放到一個文件里,供別人用。別人用的時候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。
庫函數主要由兩方面提供:一是操作系統提供的;另一類是由第三方提供的。
-
系統提供的這些函數把系統調用進行封裝或者組合,可以實現