本系列計劃把Linux的所有系統調用都扒一遍,詳細解釋每個系統調用的功能,用法,使用示例,應用場景和注意事項。
系統中支持的系統調用列表及編號都定義在 /usr/include/asm/unistd.h文件下。
以下的列表來源於64位的CentOS 7系統,詳解鏈接後面會陸續補充。
系統調用號 | 函數名 | 功能簡介 | 起始內核版本 | 詳解鏈接 |
0 | read | 讀文件內容 | ------ | |
1 | write | 向文件中寫入內容 | ------ | |
2 | open | 打開指定的文件 | ------ | |
3 | close | 關閉指定的文件 | ------ | |
4 | stat | 獲取文件狀態信息 | ||
5 | fstat | 獲取文件狀態信息 | ||
6 | lstat | 獲取文件狀態信息,對鏈接文件不解引用 | ||
7 | poll | 監聽一組文件描述符上的發生的事件 | ||
8 | lseek | 在文件中定位 | ||
9 | mmap | 映射虛擬內存頁 | ||
10 | mprotect | 控制虛擬內存權限 | ||
11 | munmap | 刪除虛擬內存映射 | ||
12 | brk | 調整堆空間範圍 | ||
13 | sigaction | 設置信號的處理函數 | ||
14 | sigprocmask | 檢查並修改阻塞的信號 | ||
15 | sigreturn | 從信號處理函數中返回並清空棧幀 | ||
16 | ioctl | 輸入輸出控制 | ||
17 | pread64 | 對大文件隨機讀 | ||
18 | pwrite64 | 對大文件隨機寫 | ||
19 | readv | 從文件中讀取內容並分散到指定的多個緩衝區 | ||
20 | writev | 從指定的多個緩衝區中獲取數據並集中寫入到文件 | ||
21 | access | 檢查文件的訪問權限 | ||
22 | pipe | 創建管道 | ||
23 | select | 多路同步IO輪詢 | ||
24 | sched_yield | 進程主動放棄處理器,並把自己放到調度隊列的隊尾 | ||
25 | mremap | 重新映射虛擬內存頁 | ||
26 | msync | 將映射內存中的內容刷新到磁盤 | ||
27 | mincore | 測試指定的內存頁是否在物理內存中 | ||
28 | madvise | 爲內存使用提供建議 | ||
29 | shmget | 獲取共享內存 | ||
30 | shmat | 連接共享內存 | ||
31 | shmctl | 共享內存屬性控制 | ||
32 | dup | 複製一個已經打開的文件描述符 | ||
33 | dup2 | 複製一個已經打開的文件描述符 | ||
34 | pause | 將當前進程掛起,等待信號喚醒 | ||
35 | nanosleep | 精確的進程睡眠控制 | ||
36 | getitimer | 獲取定時器值 | ||
37 | alarm | 設置進程的定時提醒 | ||
38 | setitimer | 設置定時器的值 | ||
39 | getpid | 獲取當前進程的進程ID | ||
40 | sendfile | 在文件或端口建傳輸數據 | ||
41 | socket | 創建一個套接字 | ||
42 | connect | 連接遠程主機 | ||
43 | accept | 接受socket上的連接請求 | ||
44 | sendto | 發送UDP消息 | ||
45 | recvfrom | 接收UDP消息 | ||
46 | sendmsg | 發送消息 | ||
47 | recvmsg | 接收消息 | ||
48 | shutdown | 關閉Socket上的連接 | ||
49 | bind | 綁定socket | ||
50 | listen | 在指定套接字上監聽網絡事件 | ||
51 | getsockname | 獲取本地套接字的名字 | ||
52 | getpeername | 獲取通信的對端套接字的名字 | ||
53 | socketpair | 創建一對已連接的無名socket | ||
54 | setsockopt | 設置socket的各種屬性 | ||
55 | getsockopt | 讀取socket的各種屬性 | ||
56 | clone | 創建線程或進程的底層支持接口 | ||
57 | fork | 創建子進程 | ||
58 | vfork | 創建子進程,比fork更加高效,但是有侷限 | ||
59 | execve | 在當前進程中運行指定的程序 | ||
60 | exit | 退出當前進程 | ||
61 | wait4 | 等待子進程終止,並可獲取子進程資源使用數據 | ||
62 | kill | 給指定的進程發送信號 | ||
63 | uname | 獲取系統名稱、版本、主機等信息 | ||
64 | semget | 獲取一組信號量 | ||
65 | semop | 操作指定的信號量 | ||
66 | semctl | 信號量屬性控制 | ||
67 | shmdt | 卸載共享內存 | ||
68 | msgget | 獲取消息隊列 | ||
69 | msgsnd | 向消息隊列發送消息 | ||
70 | msgrcv | 從消息隊列中讀取消息 | ||
71 | msgctl | 控制消息隊列 | ||
72 | fcntl | 文件描述符屬性控制 | ||
73 | flock | 文件加鎖、解鎖 | ||
74 | fsync | 將所有文件內容和文件元數據修改都同步到磁盤 | ||
75 | fdatasync | 將文件內容和重要的元數據修改同步到磁盤 | ||
76 | truncate | 截斷文件 | ||
77 | ftruncate | 對文件執行截斷 | ||
78 | getdents | 讀取目錄項 | ||
79 | getcwd | 獲取當前工作目錄 | ||
80 | chdir | 改變當前工作目錄 | ||
81 | fchdir | 改變當前工作目錄 | ||
82 | rename | 重命名指定的文件 | ||
83 | mkdir | 創建目錄 | ||
84 | rmdir | 刪除目錄 | ||
85 | creat | 創建新文件 | ||
86 | link | 創建文件鏈接 | ||
87 | unlink | 刪除文件鏈接 | ||
88 | symlink | 創建符號鏈接 | ||
89 | readlink | 讀取符號鏈接的內容 | ||
90 | chmod | 修改文件權限 | ||
91 | fchmod | 修改文件權限,參數爲已經打開的文件描述符 | ||
92 | chown | 修改文件所有者 | ||
93 | fchown | 修改文件所有者 | ||
94 | lchown | 修改鏈接文件的所有者,不解引用 | ||
95 | umask | 設置文件權限掩碼 | ||
96 | gettimeofday | 獲取當前系統時間 | ||
97 | getrlimit | 獲取當前系統限制 | ||
98 | getrusage | 獲取當前資源使用數據 | ||
99 | sysinfo | 獲取系統信息 | ||
100 | times | 獲取進程運行時間 | ||
101 | ptrace | 非常強大的進程跟蹤系統調用 | ||
102 | getuid | 獲取當前用戶標識號 | ||
103 | syslog | 讀取並清空內核消息環形緩存 | ||
104 | getgid | 獲取組標識號 | ||
105 | setuid | 設置用戶標識號 | ||
106 | setgid | 設置組標識號 | ||
107 | geteuid | 獲取有效用戶標識號 | ||
108 | getegid | 獲取有效的組標識號 | ||
109 | setpgid | 設置指定進程組標識號 | ||
110 | getppid | 獲取父進程的進程ID | ||
111 | getpgrp | 獲取指定進程組標識號 | ||
112 | setsid | 設置臨時權限用戶ID | ||
113 | setreuid | 設置真實和有效的用戶標識號 | ||
114 | setregid | 設置真實和有效的組標識號 | ||
115 | getgroups | 獲取當前進程的附屬組ID列表 | ||
116 | setgroups | 設置當前進程的附屬組ID列表 | ||
117 | setresuid | 設置進程的真實用戶ID、有效用戶ID和特權用戶ID | ||
118 | getresuid | 獲取進程的真實用戶ID、有效用戶ID和特權用戶ID | ||
119 | setresgid | 設置進程的真實組ID,有效組ID和特權組ID | ||
120 | getresgid | 獲取進程的真實組ID,有效組ID和特權組ID | ||
121 | getpgid | 獲取進程組ID | ||
122 | setfsuid | 設置進程組ID | ||
123 | setfsgid | 設置文件系統檢查時使用的組ID | ||
124 | getsid | 獲取特權用戶ID | ||
125 | capget | 獲取進程權限 | ||
126 | capset | 設置進程權限 | ||
127 | sigpending | 檢查掛起的信號 | ||
128 | sigtimedwait | 同步地等待排隊的信號 | ||
129 | sigqueueinfo | |||
130 | sigsuspend | 掛起進程來等待一個信號 | ||
131 | sigaltstack | 定義或獲取進程的信號棧 | ||
132 | utime | 修改文件的訪問時間或修改時間 | ||
133 | mknod | 創建文件系統節點 | ||
134 | uselib | 加載要使用的動態鏈接庫 | ||
135 | personality | 設置進程的運行域 | ||
136 | ustat | 獲取文件系統信息 | ||
137 | statfs | 獲取文件系統信息 | ||
138 | fstatfs | 獲取文件系統信息 | ||
139 | sysfs | 獲取系統支持的文件系統類型 | ||
140 | getpriority | 獲取進程運行優先級 | ||
141 | setpriority | 設置進程運行優先級 | ||
142 | sched_setparam | 設置進程的調度參數 | ||
143 | sched_getparam | 獲取進程的調度參數 | ||
144 | sched_setscheduler | 設置進程的調度策略和參數 | ||
145 | sched_getscheduler | 獲取進程的調度策略和參數 | ||
146 | sched_get_priority_max | 獲取進程靜態優先級上限 | ||
147 | sched_get_priority_min | 獲取進程靜態優先級下限 | ||
148 | sched_rr_get_interval | 取得按RR算法調度的實時進程的時間片長度 | ||
149 | mlock | 爲內存頁面加鎖 | ||
150 | munlock | 爲內存頁面解鎖 | ||
151 | mlockall | 當前進程的所有內存頁面加鎖 | ||
152 | munlockall | 當前進程的所有內存頁面解鎖 | ||
153 | vhangup | 掛起當前終端 | ||
154 | modify_ldt | 讀寫進程的本地描述表 | ||
155 | pivot_root | 修改當前進程的根文件目錄 | ||
156 | _sysctl | 讀/寫系統參數 | ||
157 | prctl | 進程特殊控制 | ||
158 | arch_prctl | 設置架構相關的線程狀態 | ||
159 | adjtimex | 調整系統時鐘 | ||
160 | setrlimit | 設置系統資源限制 | ||
161 | chroot | 修改根目錄 | ||
162 | sync | 將內存緩衝區數據寫回磁盤 | ||
163 | acct | 啓用或關閉進程記賬 | ||
164 | settimeofday | 設置當前系統時間和時區 | ||
165 | mount | 掛載文件系統 | ||
166 | umount2 | 卸載文件系統 | ||
167 | swapon | 開啓交換文件和設備 | ||
168 | swapoff | 關閉交換文件和設備 | ||
169 | reboot | 重啓系統 | ||
170 | sethostname | 設置主機名稱 | ||
171 | setdomainname | 設置主機域名 | ||
172 | iopl | 改變進程IO權限級別 | ||
173 | ioperm | 設置端口IO權限 | ||
174 | create_module | 創建可裝載的模塊 | ||
175 | init_module | 初始化模塊 | ||
176 | delete_module | 刪除可裝載的模塊 | ||
177 | get_kernel_syms | 獲取核心符號(已經被query_module取代) | ||
178 | query_module | 查詢模塊信息 | ||
179 | quotactl | 控制磁盤配額 | ||
180 | nfsservctl | 控制NFS守護進程 | ||
181 | getpmsg | 未實現的系統調用 | ||
182 | putpmsg | 未實現的系統調用 | ||
183 | afs_syscall | 未實現的系統調用 | ||
184 | tuxcall | 未實現的系統調用 | ||
185 | security | 未實現的系統調用 | ||
186 | gettid | 獲取線程ID | ||
187 | readahead | 把文件預讀取到頁緩存內 | ||
188 | setxattr | 設置文件或路徑的擴展屬性 | ||
189 | lsetxattr | 設置鏈接文件的擴展屬性 | ||
190 | fsetxattr | 設置文件的擴展屬性 | ||
191 | getxattr | 獲取文件或路徑的擴展屬性 | ||
192 | lgetxattr | 獲取鏈接文件的擴展屬性 | ||
193 | fgetxattr | 獲取文件或路徑的擴展屬性 | ||
194 | listxattr | 列出文件或路徑的擴展屬性 | ||
195 | llistxattr | 列出鏈接文件的擴展屬性 | ||
196 | flistxattr | 列出文件或路徑的擴展屬性 | ||
197 | removexattr | 移除文件的擴展屬性 | ||
198 | lremovexattr | 移除鏈接文件的擴展屬性 | ||
199 | fremovexattr | 移除鏈接文件的擴展屬性 | ||
200 | tkill | 給指定的線程發送信號 | ||
201 | time | 獲取系統時間 | ||
202 | futex | 快速用戶空間鎖 | ||
203 | sched_setaffinity | 設置進程的CPU親和性掩碼 | ||
204 | sched_getaffinity | 獲取進程的CPU親和性掩碼 | ||
205 | set_thread_area | 設置線程的本地存取區 | ||
206 | io_setup | 創建異步IO上下文 | ||
207 | io_destroy | 銷燬異步IO上下文 | ||
208 | io_getevents | 從完成隊列中獲取異步IO事件 | ||
209 | io_submit | 提交異步IO塊 | ||
210 | io_cancel | 取消一個未完成的同步IO操作 | ||
211 | get_thread_area | 獲取線程本地存儲區 | ||
212 | lookup_dcookie | 獲取一個cookie的完整目錄 | ||
213 | epoll_create | 創建epoll實例 | ||
214 | epoll_ctl_old | 老的epoll控制接口 | ||
215 | epoll_wait_old | 老的epoll監控接口 | ||
216 | remap_file_pages | 創建一個非線性的文件映射 | ||
217 | getdents64 | 獲取目錄入口 | ||
218 | set_tid_address | 設置存儲線程ID的內存地址 | 2.5.49 | |
219 | restart_syscall | 重新啓動一個被信號打斷的系統調用 | 2.6 | |
220 | semtimedop | System V信號操作函數 | 2.4.22 | |
221 | fadvise64 | 提前聲明一個文件的訪問模式 | 2.5.60 | |
222 | timer_create | |||
223 | timer_settime | |||
224 | timer_gettime | |||
225 | timer_getoverrun | |||
226 | timer_delete | |||
227 | clock_settime | |||
228 | clock_gettime | |||
229 | clock_getres | |||
230 | clock_nanosleep | |||
231 | exit_group | |||
232 | epoll_wait | 監聽epoll上發生的事件 | ||
233 | epoll_ctl | epoll控制接口 | ||
234 | tgkill | |||
235 | utimes | 修改文件的修改或訪問時間 | ||
236 | vserver | |||
237 | mbind | |||
238 | set_mempolicy | |||
239 | get_mempolicy | |||
240 | mq_open | |||
241 | mq_unlink | |||
242 | mq_timedsend | |||
243 | mq_timedreceive | |||
244 | mq_notify | |||
245 | mq_getsetattr | |||
246 | kexec_load | |||
247 | waitid | |||
248 | add_key | |||
249 | request_key | |||
250 | keyctl | |||
251 | ioprio_set | |||
252 | ioprio_get | |||
253 | inotify_init | |||
254 | inotify_add_watch | |||
255 | inotify_rm_watch | |||
256 | migrate_pages | |||
257 | openat | |||
258 | mkdirat | |||
259 | mknodat | |||
260 | fchownat | |||
261 | futimesat | |||
262 | newfstatat | |||
263 | unlinkat | |||
264 | renameat | |||
265 | linkat | |||
266 | symlinkat | |||
267 | readlinkat | |||
268 | fchmodat | |||
269 | faccessat | |||
270 | pselect6 | |||
271 | ppoll | |||
272 | unshare | |||
273 | set_robust_list | |||
274 | get_robust_list | |||
275 | splice | |||
276 | tee | |||
277 | sync_file_range | |||
278 | vmsplice | |||
279 | move_pages | |||
280 | utimensat | |||
281 | epoll_pwait | |||
282 | signalfd | |||
283 | timerfd_create | |||
284 | eventfd | |||
285 | fallocate | |||
286 | timerfd_settime | |||
287 | timerfd_gettime | |||
288 | accept4 | |||
289 | signalfd4 | |||
290 | eventfd2 | |||
291 | epoll_create1 | |||
292 | dup3 | |||
293 | pipe2 | |||
294 | inotify_init1 | |||
295 | preadv | |||
296 | pwritev | |||
297 | rt_tgsigqueueinfo | |||
298 | perf_event_open | |||
299 | recvmmsg | |||
300 | fanotify_init | |||
301 | fanotify_mark | |||
302 | prlimit64 | |||
303 | name_to_handle_at | |||
304 | open_by_handle_at | |||
305 | clock_adjtime | |||
306 | syncfs | 更新指定文件描述符的文件系統 | ||
307 | sendmmsg | sendmsg的擴展,可在一次系統調用中向socket發送多塊數據 | ||
308 | setns | 設置一個文件描述符的命名空間 | ||
309 | getcpu | 獲取當前線程所在的處理器和節點 | ||
310 | process_vm_readv | |||
311 | process_vm_writev | |||
312 | kcmp | |||
313 | finit_module | |||
314 | sched_setattr | |||
315 | sched_getattr | |||
316 | renameat2 | |||
317 | seccomp | |||
318 | getrandom | |||
319 | memfd_create | |||
320 | kexec_file_load | |||
323 | userfaultfd | |||
326 | copy_file_range |
把文件的一部分內容拷貝到另一個文件 |
4.5 | |
329 | pkey_mprotect | |||
330 | pkey_alloc | |||
331 | pkey_free |