系統呼叫的目的是什麼?
程序與作業系統的介面由系統呼叫提供。通常,系統呼叫以組合語言指令的形式提供。它們也包含在彙編級程式設計師使用的手冊中。當用戶模式下的程序需要訪問資源時,通常會進行系統呼叫。然後,它請求核心透過系統呼叫提供資源。
通常,在以下情況下需要系統呼叫:
- 如果檔案系統需要建立或刪除檔案。從檔案讀取和寫入也需要系統呼叫。
- 建立和管理新程序。
- 網路連線也需要系統呼叫。這包括髮送和接收資料包。
- 訪問硬體裝置(例如印表機、掃描器等)需要系統呼叫。
系統呼叫的型別
系統呼叫主要有五種型別。詳細解釋如下:
程序控制
這些系統呼叫處理諸如程序建立、程序終止等程序。
檔案管理
這些系統呼叫負責檔案操作,例如建立檔案、讀取檔案、寫入檔案等。
裝置管理
這些系統呼叫負責裝置操作,例如從裝置緩衝區讀取、寫入裝置緩衝區等。
資訊維護
這些系統呼叫處理資訊及其在作業系統和使用者程式之間的傳輸。
通訊
這些系統呼叫對於程序間通訊很有用。它們還處理建立和刪除通訊連線。
以下是 Windows 和 Unix 中所有上述型別系統呼叫的示例:
系統呼叫的型別 | Windows | Linux |
---|---|---|
程序控制 | CreateProcess() ExitProcess() WaitForSingleObject() | fork() exit() wait() |
檔案管理 | CreateFile() ReadFile() WriteFile() CloseHandle() | open() read() write() close() |
裝置管理 | SetConsoleMode() ReadConsole() WriteConsole() | ioctl() read() write() |
資訊維護 | GetCurrentProcessID() SetTimer() Sleep() | getpid() alarm() sleep() |
通訊 | CreatePipe() CreateFileMapping() MapViewOfFile() | pipe() shmget() mmap() |
系統呼叫的目的
如上所示,有許多不同的系統呼叫。其中一些系統呼叫的目的是:
open()
open() 系統呼叫用於提供對檔案系統中檔案的訪問許可權。此係統呼叫為檔案分配資源,並提供一個控制代碼,程序使用該控制代碼來引用該檔案。多個程序可以同時開啟一個檔案,也可以限制為一個程序。這完全取決於檔案組織和檔案系統。
read()
read() 系統呼叫用於訪問儲存在檔案系統中的檔案中的資料。要讀取的檔案可以透過其檔案描述符來識別,並且在讀取之前應使用 open() 開啟它。通常,read() 系統呼叫接受三個引數,即檔案描述符、儲存讀取資料的緩衝區以及要從檔案中讀取的位元組數。
write()
write() 系統呼叫將資料從使用者緩衝區寫入裝置(例如檔案)。此係統呼叫是程式輸出資料的方法之一。通常,write() 系統呼叫接受三個引數,即檔案描述符、儲存資料的緩衝區的指標以及要從緩衝區寫入的位元組數。
close()
close() 系統呼叫用於終止對檔案系統的訪問。使用此係統呼叫意味著程式不再需要該檔案,因此緩衝區被重新整理,檔案元資料被更新,並且檔案資源被釋放。
wait()
在某些系統中,程序可能會等待另一個程序完成其執行。當父程序建立子程序並且父程序的執行被掛起直到子程序執行時,就會發生這種情況。父程序的掛起是透過 wait() 系統呼叫發生的。當子程序完成執行時,控制權將返回給父程序。
此係統呼叫在已執行程序的上下文中執行可執行檔案。它替換先前的可執行檔案。這稱為覆蓋。原始程序識別符號保持不變,因為沒有建立新程序,但程序的資料、堆、棧等被新程序替換。
fork()
程序使用 fork() 系統呼叫來建立其自身的副本程序。這是作業系統中主要的程序建立方法之一。當父程序建立子程序並且父程序的執行被掛起直到子程序執行時。當子程序完成執行時,控制權將返回給父程序。
exit()
exit() 系統呼叫由程式用於終止其執行。在多執行緒環境中,這意味著執行緒執行已完成。exit() 系統呼叫後,作業系統會回收程序使用的資源。
kill()
kill() 系統呼叫由作業系統用於向程序傳送終止訊號,敦促程序退出。但是,kill() 系統呼叫並不一定意味著殺死程序,它可以有多種含義。