1. 程式人生 > >Linux系統呼叫解析

Linux系統呼叫解析

#include<linux/unistd.h>                /*定義巨集_syscall1*/
#include<time.h>                        /*定義型別time_t*/
_syscall1(time_t,time,time_t *,tloc)    /*巨集,展開後得到time()函式的原型*/
main()
{
        time_t the_time;
        the_time=time((time_t *)0);     /*呼叫time系統呼叫*/
        printf("The time is %ld\n",the_time);
}
        系統呼叫time返回從格林尼治時間1970年1月1日0:00開始到現在的秒數。
        這是最標準的系統呼叫的形式,巨集_syscall1()展開來得到一個函式原型。但事實上,如果把程式改成下面的樣子,程式也可以執行得同樣的結果。
#include<time.h>
main()
{
        time_t the_time;
        the_time=time((time_t *)0); /*呼叫time系統呼叫*/
        printf("The time is %ld\n",the_time);
}

       這是因為在time.h中實際上已經用庫函式的形式實現了time這個系統呼叫,替我們省掉了呼叫_syscall1巨集展開得到函式原型這一步。

       大多數系統呼叫都在各種C語言函式庫中有所實現,所以在一般情況下,我們都可以像呼叫普通的庫函式那樣呼叫系統呼叫,只在極個別的情況下,我們才有機會用到_syscall*()這幾個巨集。

  • 呼叫效能問題
系統呼叫需要從使用者空間陷入核心空間,處理完後,又需要返回使用者空間。其中除了系統呼叫服務例程的實際耗時外,陷入/返回過程和系統呼叫處理程式(查系統呼叫表、儲存\恢復使用者現場)也需要花銷一些時間,這些時間加起來就是一個系統呼叫的響應速度。系統呼叫不比別的使用者程式,它對效能要求很苛刻,因為它需要陷入核心執行,所以和其他核心程式一樣要求程式碼簡潔、執行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進出核心都被優化得簡潔高效;同時所有Linux系統呼叫處理程式和每個系統呼叫本身也都非常簡潔。
     絕大多數情況下,Linux系統呼叫效能是可以接受的,但是對於一些對效能要求非常高的應用來說,它們雖然希望利用系統呼叫的服務,但卻希望加快相應速度,避免陷入/返回和系統呼叫處理程式帶來的花銷,因此採用由核心直接呼叫系統呼叫服務例程,最好的例子就HTTPD——它為了避免上述開銷,從核心呼叫socket等系統呼叫服務例程。
  • Linux系統呼叫列表

程序控制

fork 建立一個新程序 clone 按指定條件建立子程序 execve 執行可執行檔案 exit 中止程序 _exit 立即中止當前程序 getdtablesize 程序所能開啟的最大檔案數 getpid 獲取程序標識號 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_yield 程序主動讓出處理器,並將自己等候排程佇列隊尾 vfork 建立一個子程序,以供執行新程式,常與execve等同時使用 wait 等待子程序終止 wait3 參見wait waitpid 等待指定子程序終止 wait4 參見waitpid capget 獲取程序許可權 capset 設定程序許可權 getsid 獲取會晤標識號 setsid 設定會晤標識號

檔案系統控制

1、檔案讀寫操作

fcntl 檔案控制 open 開啟檔案 creat 建立新檔案 close 關閉檔案描述字 read 讀檔案 write 寫檔案 readv 從檔案讀入資料到緩衝陣列writev 將緩衝陣列裡的資料寫入檔案 pread 對檔案隨機讀 lseek 移動檔案指標 _llseek 在64位地址空間裡移動檔案指標 dup 複製已開啟的檔案描述字 dup2 按指定條件複製檔案描述字 flock 檔案加/解鎖 poll I/O多路轉換 truncate 截斷檔案 umask 設定檔案許可權掩碼 fsync 把檔案在記憶體中的部分寫回磁碟

2、檔案系統操作

access 確定檔案的可存取性 chdir 改變當前工作目錄 chmod 改變檔案方式 chown 改變檔案的屬主或使用者組 lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 lstat 參見stat fstat 參見stat fstatfs 參見statfs readdir 讀取目錄項 getdents 讀取目錄項 mkdir 建立目錄 mknod 建立索引節點 rmdir 刪除目錄 rename 檔案改名 link 建立連結 symlink 建立符號連結 unlink 刪除連結 readlink 讀符號連結的值 mount 安裝檔案系統 umount 卸下檔案系統 ustat 取檔案系統資訊 utime 改變檔案的訪問修改時間 utimes 參見utime quotactl 控制磁碟配額

系統控制

ioctl I/O總控制函式 _sysctl 讀/寫系統引數 acct 啟用或禁止程序記賬 setrlimit 設定系統資源上限 getrusage 獲取系統資源使用情況 uselib 選擇要使用的二進位制函式庫 ioperm 設定埠I/O許可權 iopl 改變程序I/O許可權級別 outb 低階埠操作 reboot 重新啟動 swapon 開啟交換檔案和裝置 swapoff 關閉交換檔案和裝置 bdflush 控制bdflush守護程序 sysfs 取核心支援的檔案系統型別 sysinfo 取得系統資訊 alarm 設定程序的鬧鐘 getitimer 獲取計時器值 gettimeofday 取時間和時區 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 對映虛擬記憶體頁 mremap 重新對映虛擬記憶體地址 msync 將對映記憶體中的資料寫回磁碟 mprotect 設定記憶體映像保護 sync 將記憶體緩衝區資料寫回硬碟 cacheflush 將指定緩衝區中的內容寫回磁碟

網路管理

getdomainname 取域名 setdomainname 設定域名 gethostid 獲取主機標識號 sethostid 設定主機標識號 gethostname 獲取本主機名稱 sethostname 設定主機名稱

socket控制

socketcall socket系統呼叫 socket 建立socket bind 繫結socket到埠 connect 連線遠端主機 accept 響應socket連線請求 send 通過socket傳送資訊 sendto 傳送UDP資訊 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 設定組標誌號 setegid 設定有效組標識號 seteuid 設定有效使用者標識號 setregid 分別設定真實和有效的的組標識號 setreuid 分別設定真實和有效的使用者標識號 getresgid 分別獲取真實的,有效的和儲存過的組標識號 setresgid 分別設定真實的,有效的和儲存過的組標識號 getresuid 分別獲取真實的,有效的和儲存過的使用者標識號 setresuid 分別設定真實的,有效的和儲存過的使用者標識號 setfsgid 設定檔案系統檢查時使用的組標識號 setfsuid 設定檔案系統檢查時使用的使用者標識號 setgroups 設定後補組標誌清單

程序間通訊

ipc 程序間通訊總控制呼叫

1、訊號

sigaction 設定對指定訊號的處理方法 sigprocmask 根據引數對訊號集中的訊號執行阻塞/解除阻塞等操作 sigpending 為指定的被阻塞訊號設定佇列 signal 參見signal kill 向程序或程序組發訊號 *sigblock 向被阻塞訊號掩碼中新增訊號,已被sigprocmask代替 *siggetmask 取得現有阻塞訊號掩碼,已被sigprocmask代替 *sigsetmask 用給定訊號掩碼替換現有阻塞訊號掩碼,已被sigprocmask代替 *sigmask 將給定的訊號轉化為掩碼,已被sigprocmask代替 *sigpause 作用同sigsuspend,已被sigsuspend代替 sigvec 為相容BSD而設的訊號處理函式,作用類似sigaction ssetmask ANSI C的訊號處理函式,作用類似sigaction

2、訊息

msgctl 訊息控制操作 msgsnd 發訊息 msgrcv 取訊息

       3、管道

pipe 建立管道

4、訊號量

semctl 訊號量控制 semget 獲取一組訊號量 semop 訊號量操作

5、共享記憶體

shmctl 控制共享記憶體 shmget 獲取共享記憶體 shmat 連線共享記憶體 shmdt 拆卸共享記憶體