系統調用
應用程序同系統之間的介面
由操作系統實現提供的所有系統調用所構成的集合即程序介面或應用編程介面(ApplicationProgrammingInterface,API)。是應用程序同系統之間的介面。用戶在程序的中調用操作系統中的功能子模塊。系統調用把應用程序的請求傳給內核,調用相應的的內核函數完成所需的處理,將處理結果返回給應用程序。系統調用的調用過程和被調用過程運行在不同的狀態,而普通的過程調用一般運行在相同的狀態。系統調用必須通過軟中斷機制首先進入系統核心,然後才能轉向相應的命令處理程序。
簡述
操作系統的主要功能是為管理硬體資源和為應用程序開發人員提供良好的環境來使應用程序具有更好的兼容性,為了達到這個目的,內核提供一系列具備預定功能的多內核函數,通過一組稱為系統調用(system call)的介面呈現給用戶。系統調用把應用程序的請求傳給內核,調用相應的的內核函數完成所需的處理,將處理結果返回給應用程序。
現代的操作系統通常都具有多任務處理的功能,通常靠進程來實現。由於操作系統快速的在每個進程間切換執行,所以一切看起來就會像是同時的。同時這也帶來了很多安全問題,例如,一個進程可以輕易的修改進程的內存空間中的數據來使另一個進程異常或達到一些目的,因此操作系統必須保證每一個進程都能安全的執行。這一問題的解決方法是在處理器中加入基址寄存器和界限寄存器。這兩個寄存器中的內容用硬體限制了對儲存器的存取指令所訪問的儲存器的地址。這樣就可以在系統切換進程時寫入這兩個寄存器的內容到該進程被分配的地址範圍,從而避免惡意軟體。
為了防止用戶程序修改基址寄存器和界限寄存器中的內容來達到訪問其他內存空間的目的,這兩個寄存器必須通過一些特殊的指令來訪問。通常,處理器設有兩種模式:“用戶模式”與“內核模式”,通過一個標籤位來鑒別當前正處於什麼模式。一些諸如修改基址寄存器內容的指令只有在內核模式中可以執行,而處於用戶模式的時候硬體會直接跳過這個指令並繼續執行下一個。
同樣,為了安全問題,一些I/O操作的指令都被限制在只有內核模式可以執行,因此操作系統有必要提供介面來為應用程序提供諸如讀取磁碟某位置的數據的介面,這些介面就被稱為系統調用。
當操作系統接收到系統調用請求后,會讓處理器進入內核模式,從而執行諸如I/O操作,修改基址寄存器內容等指令,而當處理完系統調用內容后,操作系統會讓處理器返回用戶模式,來執行用戶代碼。
操作系統中的狀態分為管態(核心態)和目態(用戶態)。特權指令:一類只能在核心態下運行而不能在用戶態下運行的特殊指令。不同的操作系統特權指令會有所差異,但是一般來說主要是和硬體相關的一些指令。訪管指令:本身是一條特殊的指令,但不是特權指令。(trap指令)。基本功能:“自願進管”,能引起訪管異常。
用戶程序只在用戶態下運行,有時需要訪問系統核心功能,這時通過系統調用介面使用系統調用。
系統功能調用:就是用戶在程序中使用“訪管指令”調用由操作系統提供的子功能集合。其中每一個系統子功能稱為一個系統調用命令,也叫廣義指令。
系統功能調用是操作系統提供給程序設計人員的一種服務。程序設計人員在編寫程序時,可以利用系統調用來請求操作系統的服務。
目的:方便用戶使用。
系統調用本質上是一種過程調用,但它是一種特殊的過程調用,與一般用戶程序中的過程調用有明顯的區別。
運行狀態不同。系統調用的調用過程和被調用過程運行在不同的狀態,而普通的過程調用一般運行在相同的狀態。
調用方法不同。系統調用必須通過軟中斷機制首先進入系統核心,然後才能轉向相應的命令處理程序。普通過程調用可以直接由調用過程轉向被調用過程。
返回問題。在採用搶先式調度的系統中,當系統調用返回時,要重新進行調度分析――是否有更高優先順序的任務就緒。普通的過程調用直接返回調用過程繼續執行。
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 設置主機名稱
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 進程間通信總控制調用
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 拆卸共享內存