系統調用

系統調用

由作業系統實現提供的所有系統調用所構成的集合即程式接口或套用編程接口(Application Programming Interface,API)。是應用程式同系統之間的接口。

系統調用簡介

簡述

作業系統的主要功能是為管理硬體資源和為應用程式開發人員提供良好的環境來使應用程式具有更好的兼容性,為了達到這個目的,核心提供一系列具備預定功能的多核心函式,通過一組稱為系統調用(system call)的接口呈現給用戶。系統調用把應用程式的請求傳給核心,調用相應的的核心函式完成所需的處理,將處理結果返回給應用程式。

現代的作業系統通常都具有多任務處理的功能,通常靠進程來實現。由於作業系統快速的在每個進程間切換執行,所以一切看起來就會像是同時的。同時這也帶來了很多安全問題,例如,一個進程可以輕易的修改進程的記憶體空間中的數據來使另一個進程異常或達到一些目的,因此作業系統必須保證每一個進程都能安全的執行。這一問題的解決方法是在處理器中加入基址暫存器和界限暫存器。這兩個暫存器中的內容用硬體限制了對儲存器的存取指令所訪問的儲存器的地址。這樣就可以在系統切換進程時寫入這兩個暫存器的內容到該進程被分配的地址範圍,從而避免惡意軟體。

為了防止用戶程式修改基址暫存器和界限暫存器中的內容來達到訪問其他記憶體空間的目的,這兩個暫存器必須通過一些特殊的指令來訪問。通常,處理器設有兩種模式:“用戶模式”與“核心模式”,通過一個標籤位來鑑別當前正處於什麼模式。一些諸如修改基址暫存器內容的指令只有在核心模式中可以執行,而處於用戶模式的時候硬體會直接跳過這個指令並繼續執行下一個。

同樣,為了安全問題,一些I/O操作的指令都被限制在只有核心模式可以執行,因此作業系統有必要提供接口來為應用程式提供諸如讀取磁碟某位置的數據的接口,這些接口就被稱為系統調用。

當作業系統接收到系統調用請求後,會讓處理器進入核心模式,從而執行諸如I/O操作,修改基址暫存器內容等指令,而當處理完系統調用內容後,作業系統會讓處理器返回用戶模式,來執行用戶代碼。

系統調用原理

系統中的程式類型及狀態

作業系統中的狀態分為管態(核心態)和目態(用戶態)。特權指令:一類只能在核心態下運行而不能在用戶態下運行的特殊指令。不同的作業系統特權指令會有所差異,但是一般來說主要是和硬體相關的一些指令。訪管指令:本身是一條特殊的指令,但不是特權指令。(trap指令)。基本功能:“自願進管”,能引起訪管異常。

用戶程式只在用戶態下運行,有時需要訪問系統核心功能,這時通過系統調用接口使用系統調用。

系統功能調用

系統功能調用:就是用戶在程式中使用“訪管指令”調用由作業系統提供的子功能集合。其中每一個系統子功能稱為一個系統調用命令,也叫廣義指令。

系統調用接口

系統功能調用是作業系統提供給程式設計人員的一種服務。程式設計人員在編寫程式時,可以利用系統調用來請求作業系統的服務。

目的:方便用戶使用。

系統調用和普通調用的區別

系統調用本質上是一種過程調用,但它是一種特殊的過程調用,與一般用戶程式中的過程調用有明顯的區別 。

運行狀態不同

運行狀態不同。系統調用的調用過程和被調用過程運行在不同的狀態,而普通的過程調用一般運行在相同的狀態。

調用方法不同

調用方法不同。系統調用必須通過軟中斷機制首先進入系統核心,然後才能轉向相應的命令處理程式。普通過程調用可以直接由調用過程轉向被調用過程。

返回問題

返回問題。在採用搶先式調度的系統中,當系統調用返回時,要重新進行調度分析――是否有更高優先權的任務就緒。普通的過程調用直接返回調用過程繼續執行。

舉例: Linux作業系統中的系統調用接口

進程控制

fork 創建一個新進程

clone 按指定條件創建子進程

execve 運行執行檔

exit 中止進程

_exit 立即中止當前進程

getdtablesize 進程所能打開的最大檔案數

getpgid 獲取指定進程組標識號

setpgid 設定指定進程組標誌號

getpgrp 獲取當前進程組標識號

setpgrp 設定當前進程組標誌號

getpid 獲取進程標識號

getppid 獲取父進程標識號

getpriority 獲取調度優先權

setpriority 設定調度優先權

modify_ldt 讀寫進程的本地描述表

nanosleep 使進程睡眠指定的時間

nice 改變分時進程的優先權

pause 掛起進程,等待信號

personality 設定進程運行域

prctl 對進程進行特定操作

ptrace 進程跟蹤

sched_get_priority_max 取得靜態優先權的上限

sched_get_priority_min 取得靜態優先權的下限

sched_getparam 取得進程的調度參數

sched_getscheduler 取得指定進程的調度策略

sched_rr_get_interval 取得按RR算法調度的實時進程的時間片長度

sched_setparam 設定進程的調度參數

sched_setscheduler 設定指定進程的調度策略和參數

sched_yield 進程主動讓出處理器,並將自己等候調度佇列隊尾

vfork 創建一個子進程,以供執行新程式,常與execve等同時使用

wait 等待子進程終止

wait3 參見wait

waitpid 等待指定子進程終止

wait4 參見waitpid

capget 獲取進程許可權

capset 設定進程許可權

getsid 獲取會晤標識號

setsid 設定會晤標識號

檔案讀寫操作

fcntl 檔案控制

open 打開檔案

creat 創建新檔案

close 關閉檔案描述字

read 讀檔案

write 寫檔案

readv 從檔案讀入數據到緩衝數組中

writev 將緩衝數組裡的數據寫入檔案

pread 對檔案隨機讀

pwrite 對檔案隨機寫

lseek 移動檔案指針

_llseek 在64位地址空間裡移動檔案指針

dup 複製已打開的檔案描述字

dup2 按指定條件複製檔案描述字

flock 檔案加/解鎖

poll I/O多路轉換

truncate 截斷檔案

ftruncate 參見truncate

umask 設定檔案許可權掩碼

fsync 把檔案在記憶體中的部分寫回磁碟

檔案系統操作

access 確定檔案的可存取性

chdir 改變當前工作目錄

fchdir 參見chdir

chmod 改變檔案方式

fchmod 參見chmod

chown 改變檔案的屬主或用戶組

fchown 參見chown

lchown 參見chown

chroot 改變根目錄

stat 取檔案狀態信息

lstat 參見stat

fstat 參見stat

statfs 取檔案系統信息

fstatfs 參見statfs

readdir 讀取目錄項

getdents 讀取目錄項

mkdir 創建目錄

mknod 創建索引節點

rmdir 刪除目錄

rename 檔案改名

link 創建連結

symlink 創建符號連結

unlink 刪除連結

readlink 讀符號連結的值

mount 安裝檔案系統

umount 卸下檔案系統

ustat 取檔案系統信息

utime 改變檔案的訪問修改時間

utimes 參見utime

quotactl 控制磁碟配額

系統控制

ioctl I/O總控制函式

_sysctl 讀/寫系統參數

acct 啟用或禁止進程記賬

getrlimit 獲取系統資源上限

setrlimit 設定系統資源上限

getrusage 獲取系統資源使用情況

uselib 選擇要使用的二進制函式館

ioperm 設定連線埠I/O許可權

iopl 改變進程I/O許可權級別

outb 低級連線埠操作

reboot 重新啟動

swapon 打開交換檔案和設備

swapoff 關閉交換檔案和設備

bdflush 控制bdflush守護進程

sysfs 取核心支持的檔案系統類型

sysinfo 取得系統信息

adjtimex 調整系統時鐘

alarm 設定進程的鬧鐘

getitimer 獲取計時器值

setitimer 設定計時器值

gettimeofday 取時間和時區

settimeofday 設定時間和時區

stime 設定系統日期和時間

time 取得系統時間

times 取進程運行時間

uname 獲取當前UNIX系統的名稱、版本和主機等信息

vhangup 掛起當前終端

nfsservctl 對NFS守護進程進行控制

vm86 進入模擬8086模式

create_module 創建可裝載的模組項

delete_module 刪除可裝載的模組項

init_module 初始化模組

query_module 查詢模組信息

*get_kernel_syms 取得核心符號,已被query_module代替

記憶體管理

brk 改變數據段空間的分配

sbrk 參見brk

mlock 記憶體頁面加鎖

munlock 記憶體頁面解鎖

mlockall 調用進程所有記憶體頁面加鎖

munlockall 調用進程所有記憶體頁面解鎖

mmap 映射虛擬記憶體頁

munmap 去除記憶體頁映射

mremap 重新映射虛擬記憶體地址

msync 將映射記憶體中的數據寫回磁碟

mprotect 設定記憶體映像保護

getpagesize 獲取頁面大小

sync 將記憶體緩衝區數據寫回硬碟

cacheflush 將指定緩衝區中的內容寫回磁碟

網路

getdomainname 取域名

setdomainname 設定域名

gethostid 獲取主機標識號

sethostid 設定主機標識號

gethostname 獲取本主機名稱

sethostname 設定主機名稱

Socket 套接字

socketcall socket系統調用

socket 建立socket

bind 綁定socket到連線埠

connect 連線遠程主機

accept 回響socket連線請求

send 通過socket傳送信息

sendto 傳送UDP信息

sendmsg 參見send

recv 通過socket接收信息

recvfrom 接收UDP信息

recvmsg 參見recv

listen 監聽socket連線埠

select 對多路同步I/O進行輪詢

shutdown 關閉socket上的連線

getsockname 取得本地socket名字

getpeername 獲取通信對方的socket名字

getsockopt 取連線埠設定

setsockopt 設定連線埠參數

sendfile 在檔案或連線埠間傳輸數據

socketpair 創建一對已聯接的無名socket

用戶管理

getuid 獲取用戶標識號

setuid 設定用戶標誌號

getgid 獲取組標識號

setgid 設定組標誌號

getegid 獲取有效組標識號

setegid 設定有效組標識號

geteuid 獲取有效用戶標識號

seteuid 設定有效用戶標識號

setregid 分別設定真實和有效的的組標識號

setreuid 分別設定真實和有效的用戶標識號

getresgid 分別獲取真實的,有效的和保存過的組標識號

setresgid 分別設定真實的,有效的和保存過的組標識號

getresuid 分別獲取真實的,有效的和保存過的用戶標識號

setresuid 分別設定真實的,有效的和保存過的用戶標識號

setfsgid 設定檔案系統檢查時使用的組標識號

setfsuid 設定檔案系統檢查時使用的用戶標識號

getgroups 獲取後補組標誌清單

setgroups 設定後補組標誌清單

進程間通信

ipc 進程間通信總控制調用

sigaction 設定對指定信號的處理方法

sigprocmask 根據參數對信號集中的信號執行阻塞/解除阻塞等操作

sigpending 為指定的被阻塞信號設定佇列

sigsuspend 掛起進程等待特定信號

signal 參見signal

kill 向進程或進程組發信號

*sigblock 向被阻塞信號掩碼中添加信號,已被sigprocmask代替

*siggetmask 取得現有阻塞信號掩碼,已被sigprocmask代替

*sigsetmask 用給定信號掩碼替換現有阻塞信號掩碼,已被sigprocmask代替

*sigmask 將給定的信號轉化為掩碼,已被sigprocmask代替

*sigpause 作用同sigsuspend,已被sigsuspend代替

sigvec 為兼容BSD而設的信號處理函式,作用類似sigaction

ssetmask ANSI C的信號處理函式,作用類似sigaction

訊息

msgctl 訊息控制操作

msgget 獲取訊息佇列

msgsnd 發訊息

msgrcv 取訊息

管道

pipe 創建管道

信號量

semctl 信號量控制

semget 獲取一組信號量

semop 信號量操作

共享記憶體

shmctl 控制共享記憶體

shmget 獲取共享記憶體

shmat 連線共享記憶體

shmdt 拆卸共享記憶體

相關詞條

相關搜尋

熱門詞條

聯絡我們