什麼是系統呼叫,系統呼叫的過程

2020-07-16 10:04:37
系統呼叫(system call)提供作業系統服務介面。這些呼叫通常以 C 或 C++ 編寫,當然,對某些底層任務(如需直接存取硬體的任務),可能應以組合語言指令編寫。

在討論作業系統如何提供系統呼叫之前,首先通過例子來看看如何使用系統呼叫:編寫一個簡單程式,從一個檔案讀取資料並複製到另一個檔案。程式首先需要輸入兩個檔名稱:輸入檔名稱和輸出檔名稱。這些名稱有許多不同的給定方法,這取決於作業系統設計。

一種方法是,讓程式詢問使用者這兩個檔名稱。對於互動系統,該方法包括一系列的系統呼叫:先在螢幕上輸出提示資訊,再從鍵盤上讀取定義兩個檔名稱的字元。對於基於滑鼠和圖示的系統,一個檔名稱的選單通常顯示在視窗內。使用者通過滑鼠選擇原始檔名稱,另一個類似視窗可以用來選擇目的檔名稱。這個過程需要許多 I/O 系統呼叫。

在得到兩個檔名稱後,該程式開啟輸入檔案並建立輸出檔案。每個操作都需要一個系統呼叫。每個操作都有可能遇到錯誤情況,進而可能需要其他系統呼叫。

例如,當程式設法開啟輸入檔案時,它可能發現該檔案不存在或者該檔案受保護而不能存取。在這些情況下,程式應在控制台上列印出訊息(另一系列系統呼叫),並且非正常地終止(另一個系統呼叫)。如果輸入檔案存在,那麼必須建立輸出檔案。可能發現具有同一名稱的輸出檔案已存在。這種情況可以導致程式中止(一個系統呼叫),或者可以刪除現有檔案(另一個系統呼叫)並建立新的檔案(另一個系統呼叫)。對於互動系統,另一選擇是詢問使用者(一系列的系統呼叫以輸出提示資訊並從控制台讀人響應)是否需要替代現有檔案或中止程式。

現在兩個檔案已設定好,可進入迴圈,以讀取輸入檔案(一個系統呼叫),並寫到輸出檔案(另一個系統呼叫)。每個讀和寫都應返回一些關於各種可能錯誤的狀態資訊。對於輸入,程式可能發現已經到達檔案的結束,或者在讀過程中發生了硬體故障(如奇偶檢驗錯誤)。對寫操作,也可能出現各種錯誤,這取決於輸出裝置(例如,沒有磁碟空間)。

最後,在複製了整個檔案後,程式可以關閉兩個檔案(另一個系統呼叫),在控制台或視窗上寫一個訊息(更多系統呼叫),最後正常結束(最後一個系統呼叫)。圖 1 顯示了這個系統呼叫序列。

如何使用系統調用的例子
圖 1 如何使用系統呼叫的例子