1. syscalls相关摘录
1.1 系统调用可以大致分为六大类:
1.2 典型实现(Linux)
2. Linux系统调用列表
3. 使用 strace 跟踪系统调用
4. See also
1. syscalls相关摘录
https://en.wikipedia.org/wiki/System_call
在Unix的, 类Unix和其他POSIX兼容的操作系统, 流行的系统调用open, read, write, close, wait, exec, fork, exit, 和kill。许多现代操作系统都有数百个系统调用。例如,
- Linux和OpenBSD各自具有300多个不同的调用;
- NetBSD具有近500个调用, FreeBSD具有500多个;
- Windows 7具有接近700的调用;
- 而Plan 9具有51.
诸如strace, ftrace和truss之类的工具允许进程从开始执行并报告该进程调用的所有系统调用, 或者可以附加到已经运行的进程并拦截该进程进行的任何系统调用(如果该操作未违反以下权限)用户。程序的这种特殊功能通常也可以通过系统调用来实现, 例如, strace可以通过ptrace来实现, 也可以通过对文件procfs中的系统调用来实现。
1.1 系统调用可以大致分为六大类:
1. 进程控制 Process control | create process (fork…) | 创建进程 (fork) |
| terminate process | 终止进程 |
| load, execute | 加载, 执行 |
| get/set process attributes | 获取/设置 进程属性 |
| wait for time, wait event, signal event | 等待时间, 等待事件, 信号事件 |
| allocate and free memory | 分配和释放内存 |
2. 文件管理 File management | create file, delete file | 创建文件, 删除文件 |
| open, close | 打开, 关闭 |
| read, write, reposition | 读, 写, 重新定位 |
| get/set file attributes | 获取/设置 文件属性 |
3. 设备管理 Device management | request device, release device | 请求设备, 释放设备 |
| read, write, reposition | 读, 写, 重新定位 |
| get/set device attributes | 获取/设置 设备属性 |
| logically attach or detach devices | 逻辑上连接或分离设备 |
4. 信息维护 Information maintenance | get/set time or date | 获取/设置时间或日期 |
| get/set system data | 获取/设置系统数据 |
| get/set process, file, or device attributes | 获取/设置进程, 文件或设备属性 |
5. 通讯 Communication | create, delete communication connection | 创建, 删除通讯连接 |
| send, receive messages | 发送, 接收消息 |
| transfer status information | 传输状态信息 |
| attach or detach remote devices | 连接或分离远程设备 |
| 6. 保护 Protection | get/set file permissions | 获取/设置 文件权限 |
1.2 典型实现(Linux)
https://zh.wikipedia.org/wiki/系统调用
在电脑中, 系统调用(英语:system call), 指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态运行。如设备IO操作或者进程间通信。
操作系统的进程空间可分为用户空间和内核空间, 它们需要不同的执行权限。其中系统调用运行在内核空间。
系统调用和普通库函数调用非常相似, 只是系统调用由操作系统内核提供, 运行于内核核心态, 而普通的库函数调用由函数库或用户自己提供, 运行于用户态。
Linux 的系统调用通过 int 80h 实现, 用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:
- 应用程序调用库函数(API);
- API 将系统调用号存入 EAX, 然后通过中断调用使系统进入内核态;
- 内核中的中断处理函数根据系统调用号, 调用对应的内核函数(系统调用);
- 系统调用完成相应功能, 将返回值存入 EAX, 返回到中断处理函数;
- 中断处理函数返回到 API 中;
- API 将 EAX 返回给应用程序。
应用程序调用系统调用的过程是:
- 把系统调用的编号存入 EAX;
- 把函数参数存入其它通用寄存器;
- 触发 0x80 号中断(int 0x80)。
2. Linux系统调用列表
2020-04-11 470个: https://jlk.fjfi.cvut.cz/arch/manpages/man/syscalls.2#NOTES
2002-03-01 206个 有中文描述: https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html
| N | System call | Kernel | Notes | 中文描述 | 类别 |
| | _llseek(2) | 1.2 | | 在64位地址空间里移动文件指针 | 文件系统控制 |
| | _newselect(2) | 2 | | | |
| | _sysctl(2) | 2 | | 读/写系统参数 | 系统控制 |
| t | accept(2) | 2 | See notes on socketcall(2) | 响应socket连接请求 | socket控制 |
| t | accept4(2) | 2.6.28 | | | |
| | access(2) | 1 | | 确定文件的可存取性 | 文件系统控制 |
| | acct(2) | 1 | | 启用或禁止进程记账 | 系统控制 |
| | add_key(2) | 2.6.10 | | | |
| | adjtimex(2) | 1 | | 调整系统时钟 | 系统控制 |
| | alarm(2) | 1 | | 设置进程的闹钟 | 系统控制 |
| | alloc_hugepages(2) | 2.5.36 | Removed in 2.5.44 | | |
| | arc_gettls(2) | 3.9 | ARC only | | |
| | arc_settls(2) | 3.9 | ARC only | | |
| | arc_usr_cmpxchg(2) | 4.9 | ARC only | | |
| | arch_prctl(2) | 2.6 | x86_64, x86 since 4.12 | | |
| | atomic_barrier(2) | 2.6.34 | m68k only | | |
| | atomic_cmpxchg_32(2) | 2.6.34 | m68k only | | |
| | bdflush(2) | 1.2 | Deprecated (does nothing) since 2.6 | 控制bdflush守护进程 | 系统控制 |
| | bfin_spinlock(2) | 2.6.22 | Blackfin only (port removed in Linux 4.17) | | |
| | bind(2) | 2 | See notes on socketcall(2) | 绑定socket到端口 | socket控制 |
| | bpf(2) | 3.18 | | | |
| | breakpoint(2) | 2.2 | ARM OABI only, defined with __ARM_NR prefix | | |
| | brk(2) | 1 | | 改变数据段空间的分配 | 内存管理 |
| | cacheflush(2) | 1.2 | Not on x86 | 将指定缓冲区中的内容写回磁盘 | 内存管理 |
| | capget(2) | 2.2 | | 获取进程权限 | 进程控制 |
| | capset(2) | 2.2 | | 设置进程权限 | 进程控制 |
| | chdir(2) | 1 | | 改变当前工作目录 | 文件系统控制 |
| | chmod(2) | 1 | | 改变文件方式 | 文件系统控制 |
| t | chown(2) | 2.2 | See chown(2) for version details | 改变文件的属主或用户组 | 文件系统控制 |
| t | chown32(2) | 2.4 | | | |
| | chroot(2) | 1 | | 改变根目录 | 文件系统控制 |
| | clock_adjtime(2) | 2.6.39 | | | |
| | clock_getres(2) | 2.6 | | | |
| | clock_gettime(2) | 2.6 | | | |
| | clock_nanosleep(2) | 2.6 | | | |
| | clock_settime(2) | 2.6 | | | |
| t | clone(2) | 1 | | 按指定条件创建子进程 | 进程控制 |
| t | clone2(2) | 2.4 | IA-64 only | | |
| t | clone3(2) | 5.3 | | | |
| | close(2) | 1 | | 关闭文件描述字 | 文件系统控制 |
| | cmpxchg_badaddr(2) | 2.6.36 | Tile only (port removed in Linux 4.17) | | |
| | connect(2) | 2 | See notes on socketcall(2) | 连接远程主机 | socket控制 |
| | copy_file_range(2) | 4.5 | | | |
| | creat(2) | 1 | | 创建新文件 | 文件系统控制 |
| | create_module(2) | 1 | Removed in 2.6 | 创建可装载的模块项 | 系统控制 |
| | delete_module(2) | 1 | | 删除可装载的模块项 | 系统控制 |
| | dma_memcpy(2) | 2.6.22 | Blackfin only (port removed in Linux 4.17) | | |
| t | dup(2) | 1 | | 复制已打开的文件描述字 | 文件系统控制 |
| t | dup2(2) | 1 | | 按指定条件复制文件描述字 | 文件系统控制 |
| t | dup3(2) | 2.6.27 | | | |
| t | epoll_create(2) | 2.6 | | | |
| t | epoll_create1(2) | 2.6.27 | | | |
| | epoll_ctl(2) | 2.6 | | | |
| | epoll_pwait(2) | 2.6.19 | | | |
| | epoll_wait(2) | 2.6 | | | |
| t | eventfd(2) | 2.6.22 | | | |
| t | eventfd2(2) | 2.6.27 | | | |
| | execv(2) | 2 | SPARC/SPARC64 only, for compatibility with SunOS | | |
| | execve(2) | 1 | | 运行可执行文件 | 进程控制 |
| | execveat(2) | 3.19 | | | |
| | exit_group(2) | 2.6 | | | |
| | exit(2) | 1 | | 中止进程 | 进程控制 |
| | faccessat(2) | 2.6.16 | | | |
| t | fadvise64_64(2) | 2.6 | | | |
| t | fadvise64(2) | 2.6 | | | |
| | fallocate(2) | 2.6.23 | | | |
| | fanotify_init(2) | 2.6.37 | | | |
| | fanotify_mark(2) | 2.6.37 | | | |
| | fchdir(2) | 1 | | 参见chdir | 文件系统控制 |
| | fchmod(2) | 1 | | 参见chmod | 文件系统控制 |
| | fchmodat(2) | 2.6.16 | | | |
| t | fchown(2) | 1 | | 参见chown | 文件系统控制 |
| t | fchown32(2) | 2.4 | | | |
| | fchownat(2) | 2.6.16 | | | |
| t | fcntl(2) | 1 | | 文件控制 | 文件系统控制 |
| t | fcntl64(2) | 2.4 | | | |
| | fdatasync(2) | 2 | | | |
| | fgetxattr(2) | 2.6; 2.4.18 | | | |
| | finit_module(2) | 3.8 | | | |
| | flistxattr(2) | 2.6; 2.4.18 | | | |
| | flock(2) | 2 | | 文件加/解锁 | 文件系统控制 |
| | fork(2) | 1 | | 创建一个新进程 | 进程控制 |
| | free_hugepages(2) | 2.5.36 | Removed in 2.5.44 | | |
| | fremovexattr(2) | 2.6; 2.4.18 | | | |
| | fsconfig(2) | 5.2 | | | |
| | fsetxattr(2) | 2.6; 2.4.18 | | | |
| | fsmount(2) | 5.2 | | | |
| | fsopen(2) | 5.2 | | | |
| | fspick(2) | 5.2 | | | |
| t | fstat(2) | 1 | | 参见stat | 文件系统控制 |
| t | fstat64(2) | 2.4 | | | |
| | fstatat64(2) | 2.6.16 | | | |
| t | fstatfs(2) | 1 | | 参见statfs | 文件系统控制 |
| t | fstatfs64(2) | 2.6 | | | |
| | fsync(2) | 1 | | 把文件在内存中的部分写回磁盘 | 文件系统控制 |
| t | ftruncate(2) | 1 | | 参见truncate | 文件系统控制 |
| t | ftruncate64(2) | 2.4 | | | |
| | futex(2) | 2.6 | | | |
| | futimesat(2) | 2.6.16 | | | |
| | get_kernel_syms(2) | 1 | Removed in 2.6 | | |
| | get_mempolicy(2) | 2.6.6 | | | |
| | get_robust_list(2) | 2.6.17 | | | |
| | get_thread_area(2) | 2.6 | | | |
| | get_tls(2) | 4.15 | ARM OABI only, has __ARM_NR prefix | | |
| | getcpu(2) | 2.6.19 | | | |
| | getcwd(2) | 2.2 | | | |
| t | getdents(2) | 2 | | 读取目录项 | 文件系统控制 |
| t | getdents64(2) | 2.4 | | | |
| | getdomainname(2) | 2.2 | SPARC, SPARC64; available as osf_getdomainname(2) on Alpha since Linux 2.0 | 取域名 | 网络管理 |
| | getdtablesize(2) | 2 | SPARC (removed in 2.6.26), available on Alpha as osf_getdtablesize(2) | 进程所能打开的最大文件数 | 进程控制 |
| t | getegid(2) | 1 | | 获取有效组标识号 | 用户管理 |
| t | getegid32(2) | 2.4 | | | |
| t | geteuid(2) | 1 | | 获取有效用户标识号 | 用户管理 |
| t | geteuid32(2) | 2.4 | | | |
| t | getgid(2) | 1 | | 获取组标识号 | 用户管理 |
| t | getgid32(2) | 2.4 | | | |
| t | getgroups(2) | 1 | | 获取后补组标志清单 | 用户管理 |
| t | getgroups32(2) | 2.4 | | | |
| | gethostname(2) | 2 | Alpha, was available on SPARC up to Linux 2.6.26 | 获取本主机名称 | 网络管理 |
| | getitimer(2) | 1 | | 获取计时器值 | 系统控制 |
| | getpagesize(2) | 2 | Not on x86 | 获取页面大小 | 内存管理 |
| | getpeername(2) | 2 | See notes on socketcall(2) | 获取通信对方的socket名字 | socket控制 |
| | getpgid(2) | 1 | | 获取指定进程组标识号 | 进程控制 |
| | getpgrp(2) | 1 | | 获取当前进程组标识号 | 进程控制 |
| | getpid(2) | 1 | | 获取进程标识号 | 进程控制 |
| | getppid(2) | 1 | | 获取父进程标识号 | 进程控制 |
| | getpriority(2) | 1 | | 获取调度优先级 | 进程控制 |
| | getrandom(2) | 3.17 | | | |
| t | getresgid(2) | 2.2 | | 分别获取真实的,有效的和保存过的组标识号 | 用户管理 |
| t | getresgid32(2) | 2.4 | | | |
| t | getresuid(2) | 2.2 | | 分别获取真实的,有效的和保存过的用户标识号 | 用户管理 |
| t | getresuid32(2) | 2.4 | | | |
| | getrlimit(2) | 1 | | 获取系统资源上限 | 系统控制 |
| | getrusage(2) | 1 | | 获取系统资源使用情况 | 系统控制 |
| | getsid(2) | 2 | | 获取会晤标识号 | 进程控制 |
| | getsockname(2) | 2 | See notes on socketcall(2) | 取得本地socket名字 | socket控制 |
| | getsockopt(2) | 2 | See notes on socketcall(2) | 取端口设置 | socket控制 |
| | gettid(2) | 2.4.11 | | | |
| | gettimeofday(2) | 1 | | 取时间和时区 | 系统控制 |
| t | getuid(2) | 1 | | 获取用户标识号 | 用户管理 |
| t | getuid32(2) | 2.4 | | | |
| | getunwind(2) | 2.4.8 | IA-64 only; deprecated | | |
| | getxattr(2) | 2.6; 2.4.18 | | | |
| | getxgid(2) | 2 | Alpha only; see NOTES | | |
| | getxpid(2) | 2 | Alpha only; see NOTES | | |
| | getxuid(2) | 2 | Alpha only; see NOTES | | |
| | init_module(2) | 1 | | 初始化模块 | 系统控制 |
| | inotify_add_watch(2) | 2.6.13 | | | |
| | inotify_init(2) | 2.6.13 | | | |
| | inotify_init1(2) | 2.6.27 | | | |
| | inotify_rm_watch(2) | 2.6.13 | | | |
| | io_cancel(2) | 2.6 | | | |
| | io_destroy(2) | 2.6 | | | |
| | io_getevents(2) | 2.6 | | | |
| | io_pgetevents(2) | 4.18 | | | |
| | io_setup(2) | 2.6 | | | |
| | io_submit(2) | 2.6 | | | |
| | io_uring_enter(2) | 5.1 | | | |
| | io_uring_register(2) | 5.1 | | | |
| | io_uring_setup(2) | 5.1 | | | |
| | ioctl(2) | 1 | | I/O总控制函数 | 系统控制 |
| | ioperm(2) | 1 | | 设置端口I/O权限 | 系统控制 |
| | iopl(2) | 1 | | 改变进程I/O权限级别 | 系统控制 |
| | ioprio_get(2) | 2.6.13 | | | |
| | ioprio_set(2) | 2.6.13 | | | |
| | ipc(2) | 1 | | 进程间通信总控制调用 | 进程间通信 |
| | kcmp(2) | 3.5 | | | |
| | kern_features(2) | 3.7 | SPARC64 only | | |
| | kexec_file_load(2) | 3.17 | | | |
| | kexec_load(2) | 2.6.13 | | | |
| | keyctl(2) | 2.6.10 | | | |
| | kill(2) | 1 | | 向进程或进程组发信号 | 进程间通信 |
| t | lchown(2) | 1 | See chown(2) for version details | 参见chown | 文件系统控制 |
| t | lchown32(2) | 2.4 | | | |
| | lgetxattr(2) | 2.6; 2.4.18 | | | |
| | link(2) | 1 | | 创建链接 | 文件系统控制 |
| | linkat(2) | 2.6.16 | | | |
| | listen(2) | 2 | See notes on socketcall(2) | 监听socket端口 | socket控制 |
| | listxattr(2) | 2.6; 2.4.18 | | | |
| | llistxattr(2) | 2.6; 2.4.18 | | | |
| | lookup_dcookie(2) | 2.6 | | | |
| | lremovexattr(2) | 2.6; 2.4.18 | | | |
| | lseek(2) | 1 | | 移动文件指针 | 文件系统控制 |
| | lsetxattr(2) | 2.6; 2.4.18 | | | |
| | lstat(2) | 1 | | 参见stat | 文件系统控制 |
| | lstat64(2) | 2.4 | | | |
| | madvise(2) | 2.4 | | | |
| | mbind(2) | 2.6.6 | | | |
| | membarrier(2) | 3.17 | | | |
| | memfd_create(2) | 3.17 | | | |
| | memory_ordering(2) | 2.2 | SPARC64 only | | |
| | metag_get_tls(2) | 3.9 | Metag only (port removed in Linux 4.17) | | |
| | metag_set_fpu_flags(2) | 3.9 | Metag only (port removed in Linux 4.17) | | |
| | metag_set_tls(2) | 3.9 | Metag only (port removed in Linux 4.17) | | |
| | metag_setglobalbit(2) | 3.9 | Metag only (port removed in Linux 4.17) | | |
| | migrate_pages(2) | 2.6.16 | | | |
| | mincore(2) | 2.4 | | | |
| | mkdir(2) | 1 | | 创建目录 | 文件系统控制 |
| | mkdirat(2) | 2.6.16 | | | |
| | mknod(2) | 1 | | 创建索引节点 | 文件系统控制 |
| | mknodat(2) | 2.6.16 | | | |
| t | mlock(2) | 2 | | 内存页面加锁 | 内存管理 |
| t | mlock2(2) | 4.4 | | | |
| | mlockall(2) | 2 | | 调用进程所有内存页面加锁 | 内存管理 |
| t | mmap(2) | 1 | | 映射虚拟内存页 | 内存管理 |
| t | mmap2(2) | 2.4 | | | |
| | modify_ldt(2) | 1 | | 读写进程的本地描述表 | 进程控制 |
| | mount(2) | 1 | | 安装文件系统 | 文件系统控制 |
| | move_mount(2) | 5.2 | | | |
| | move_pages(2) | 2.6.18 | | | |
| | mprotect(2) | 1 | | 设置内存映像保护 | 内存管理 |
| | mq_getsetattr(2) | 2.6.6 | | | |
| | mq_notify(2) | 2.6.6 | | | |
| | mq_open(2) | 2.6.6 | | | |
| | mq_timedreceive(2) | 2.6.6 | | | |
| | mq_timedsend(2) | 2.6.6 | | | |
| | mq_unlink(2) | 2.6.6 | | | |
| | mremap(2) | 2 | | 重新映射虚拟内存地址 | 内存管理 |
| | msgctl(2) | 2 | See notes on ipc(2) | 消息控制操作 | 进程间通信 |
| | msgget(2) | 2 | See notes on ipc(2) | 获取消息队列 | 进程间通信 |
| | msgrcv(2) | 2 | See notes on ipc(2) | 取消息 | 进程间通信 |
| | msgsnd(2) | 2 | See notes on ipc(2) | 发消息 | 进程间通信 |
| | msync(2) | 2 | | 将映射内存中的数据写回磁盘 | 内存管理 |
| | munlock(2) | 2 | | 内存页面解锁 | 内存管理 |
| | munlockall(2) | 2 | | 调用进程所有内存页面解锁 | 内存管理 |
| | munmap(2) | 1 | | 去除内存页映射 | 内存管理 |
| | name_to_handle_at(2) | 2.6.39 | | | |
| | nanosleep(2) | 2 | | 使进程睡眠指定的时间 | 进程控制 |
| | newfstatat(2) | 2.6.16 | See stat(2) | | |
| | nfsservctl(2) | 2.2 | Removed in 3.1 | 对NFS守护进程进行控制 | 系统控制 |
| | nice(2) | 1 | | 改变分时进程的优先级 | 进程控制 |
| | old_adjtimex(2) | 2 | Alpha only; see NOTES | | |
| | old_getrlimit(2) | 2.4 | Old variant of getrlimit(2) that used a different value for RLIM_INFINITY | | |
| | oldfstat(2) | 1 | | | |
| | oldlstat(2) | 1 | | | |
| | oldolduname(2) | 1 | | | |
| | oldstat(2) | 1 | | | |
| | oldumount(2) | 2.4.116 | Name of the old umount(2) syscall on Alpha | | |
| | olduname(2) | 1 | | | |
| | open_by_handle_at(2) | 2.6.39 | | | |
| | open_tree(2) | 5.2 | | | |
| | open(2) | 1 | | 打开文件 | 文件系统控制 |
| t | openat(2) | 2.6.16 | | | |
| t | openat2(2) | 5.6 | | | |
| | or1k_atomic(2) | 3.1 | OpenRISC 1000 only | | |
| | pause(2) | 1 | | 挂起进程,等待信号 | 进程控制 |
| | pciconfig_iobase(2) | 2.2.15; 2.4 | Not on x86 | | |
| | pciconfig_read(2) | 2.0.26; 2.2 | Not on x86 | | |
| | pciconfig_write(2) | 2.0.26; 2.2 | Not on x86 | | |
| | perf_event_open(2) | 2.6.31 | Was perf_counter_open() in 2.6.31; renamed in 2.6.32 | | |
| | perfctr(2) | 2.2 | SPARC only; removed in 2.6.34 | | |
| | perfmonctl(2) | 2.4 | IA-64 only | | |
| | personality(2) | 1.2 | | 设置进程运行域 | 进程控制 |
| | pidfd_getfd(2) | 5.6 | | | |
| | pidfd_open(2) | 5.3 | | | |
| | pidfd_send_signal(2) | 5.1 | | | |
| t | pipe(2) | 1 | | 创建管道 | 进程间通信 |
| t | pipe2(2) | 2.6.27 | | | |
| | pivot_root(2) | 2.4 | | | |
| | pkey_alloc(2) | 4.8 | | | |
| | pkey_free(2) | 4.8 | | | |
| | pkey_mprotect(2) | 4.8 | | | |
| | poll(2) | 2.0.36; 2.2 | | I/O多路转换 | 文件系统控制 |
| | ppoll(2) | 2.6.16 | | | |
| | prctl(2) | 2.2 | | 对进程进行特定操作 | 进程控制 |
| t | pread(2) | | Used for pread64(2) on AVR32 (port removed in Linux 4.12) and Blackfin (port removed in Linux 4.17) | 对文件随机读 | 文件系统控制 |
| t | pread64(2) | | Added as "pread" in 2.2; renamed "pread64" in 2.6 | | |
| | preadv(2) | 2.6.30 | | | |
| | preadv2(2) | 4.6 | | | |
| | prlimit64(2) | 2.6.36 | | | |
| | process_vm_readv(2) | 3.2 | | | |
| | process_vm_writev(2) | 3.2 | | | |
| | pselect6(2) | 2.6.16 | | | |
| | ptrace(2) | 1 | | 进程跟踪 | 进程控制 |
| t | pwrite(2) | | Used for pwrite64(2) on AVR32 (port removed in Linux 4.12) and Blackfin (port removed in Linux 4.17) | 对文件随机写 | 文件系统控制 |
| t | pwrite64(2) | | Added as "pwrite" in 2.2; renamed "pwrite64" in 2.6 | | |
| t | pwritev(2) | 2.6.30 | | | |
| t | pwritev2(2) | 4.6 | | | |
| | query_module(2) | 2.2 | Removed in 2.6 | 查询模块信息 | 系统控制 |
| | quotactl(2) | 1 | | 控制磁盘配额 | 文件系统控制 |
| | read(2) | 1 | | 读文件 | 文件系统控制 |
| | readahead(2) | 2.4.13 | | | |
| | readdir(2) | 1 | | 读取目录项 | 文件系统控制 |
| | readlink(2) | 1 | | 读符号链接的值 | 文件系统控制 |
| | readlinkat(2) | 2.6.16 | | | |
| | readv(2) | 2 | | 从文件读入数据到缓冲数组中 | 文件系统控制 |
| | reboot(2) | 1 | | 重新启动 | 系统控制 |
| | recv(2) | 2 | See notes on socketcall(2) | 通过socket接收信息 | socket控制 |
| | recvfrom(2) | 2 | See notes on socketcall(2) | 接收UDP信息 | socket控制 |
| | recvmmsg(2) | 2.6.33 | | | |
| | recvmsg(2) | 2 | See notes on socketcall(2) | 参见recv | socket控制 |
| | remap_file_pages(2) | 2.6 | Deprecated since 3.16 | | |
| | removexattr(2) | 2.6; 2.4.18 | | | |
| | rename(2) | 1 | | 文件改名 | 文件系统控制 |
| t | renameat(2) | 2.6.16 | | | |
| t | renameat2(2) | 3.15 | | | |
| | request_key(2) | 2.6.10 | | | |
| | restart_syscall(2) | 2.6 | | | |
| | riscv_flush_icache(2) | 4.15 | RISC-V only | | |
| | rmdir(2) | 1 | | 删除目录 | 文件系统控制 |
| | rseq(2) | 4.18 | | | |
| | rt_sigaction(2) | 2.2 | | | |
| | rt_sigpending(2) | 2.2 | | | |
| | rt_sigprocmask(2) | 2.2 | | | |
| | rt_sigqueueinfo(2) | 2.2 | | | |
| | rt_sigreturn(2) | 2.2 | | | |
| | rt_sigsuspend(2) | 2.2 | | | |
| | rt_sigtimedwait(2) | 2.2 | | | |
| | rt_tgsigqueueinfo(2) | 2.6.31 | | | |
| | rtas(2) | 2.6.2 | PowerPC/PowerPC64 only | | |
| | s390_guarded_storage(2) | 4.12 | s390 only | | |
| | s390_pci_mmio_read(2) | 3.19 | s390 only | | |
| | s390_pci_mmio_write(2) | 3.19 | s390 only | | |
| | s390_runtime_instr(2) | 3.7 | s390 only | | |
| | s390_sthyi(2) | 4.15 | s390 only | | |
| | sched_get_affinity(2) | 2.6 | Name of sched_getaffinity(2) on SPARC and SPARC64 | | |
| | sched_get_priority_max(2) | 2 | | 取得静态优先级的上限 | 进程控制 |
| | sched_get_priority_min(2) | 2 | | 取得静态优先级的下限 | 进程控制 |
| | sched_getaffinity(2) | 2.6 | | | |
| | sched_getattr(2) | 3.14 | | | |
| | sched_getparam(2) | 2 | | 取得进程的调度参数 | 进程控制 |
| | sched_getscheduler(2) | 2 | | 取得指定进程的调度策略 | 进程控制 |
| | sched_rr_get_interval(2) | 2 | | 取得按RR算法调度的实时进程的时间片长度 | 进程控制 |
| | sched_set_affinity(2) | 2.6 | Name of sched_setaffinity(2) on SPARC and SPARC64 | | |
| | sched_setaffinity(2) | 2.6 | | | |
| | sched_setattr(2) | 3.14 | | | |
| | sched_setparam(2) | 2 | | 设置进程的调度参数 | 进程控制 |
| | sched_setscheduler(2) | 2 | | 设置指定进程的调度策略和参数 | 进程控制 |
| | sched_yield(2) | 2 | | 进程主动让出处理器,并将自己等候调度队列队尾 | 进程控制 |
| | seccomp(2) | 3.17 | | | |
| | select(2) | 1 | | 对多路同步I/O进行轮询 | socket控制 |
| | semctl(2) | 2 | See notes on ipc(2) | 信号量控制 | 进程间通信 |
| | semget(2) | 2 | See notes on ipc(2) | 获取一组信号量 | 进程间通信 |
| | semop(2) | 2 | See notes on ipc(2) | 信号量操作 | 进程间通信 |
| | semtimedop(2) | 2.6; 2.4.22 | | | |
| | send(2) | 2 | See notes on socketcall(2) | 通过socket发送信息 | socket控制 |
| | sendfile(2) | 2.2 | | 在文件或端口间传输数据 | socket控制 |
| | sendfile64(2) | 2.6; 2.4.19 | | | |
| | sendmmsg(2) | 3 | | | |
| | sendmsg(2) | 2 | See notes on socketcall(2) | 参见send | socket控制 |
| | sendto(2) | 2 | See notes on socketcall(2) | 发送UDP信息 | socket控制 |
| | set_mempolicy(2) | 2.6.6 | | | |
| | set_robust_list(2) | 2.6.17 | | | |
| | set_thread_area(2) | 2.6 | | | |
| | set_tid_address(2) | 2.6 | | | |
| | set_tls(2) | 2.6.11 | ARM OABI/EABI only (constant has __ARM_NR prefix) | | |
| | setdomainname(2) | 1 | | 设置域名 | 网络管理 |
| t | setfsgid(2) | 1.2 | | 设置文件系统检查时使用的组标识号 | 用户管理 |
| t | setfsgid32(2) | 2.4 | | | |
| t | setfsuid(2) | 1.2 | | 设置文件系统检查时使用的用户标识号 | 用户管理 |
| t | setfsuid32(2) | 2.4 | | | |
| t | setgid(2) | 1 | | 设置组标志号 | 用户管理 |
| t | setgid32(2) | 2.4 | | | |
| t | setgroups(2) | 1 | | 设置后补组标志清单 | 用户管理 |
| t | setgroups32(2) | 2.4 | | | |
| | sethae(2) | 2 | Alpha only; see NOTES | | |
| | sethostname(2) | 1 | | 设置主机名称 | 网络管理 |
| | setitimer(2) | 1 | | 设置计时器值 | 系统控制 |
| | setns(2) | 3 | | | |
| | setpgid(2) | 1 | | 设置指定进程组标志号 | 进程控制 |
| | setpgrp(2) | 2 | Alternative name for setpgid(2) on Alpha | 设置当前进程组标志号 | 进程控制 |
| | setpriority(2) | 1 | | 设置调度优先级 | 进程控制 |
| t | setregid(2) | 1 | | 分别设置真实和有效的的组标识号 | 用户管理 |
| t | setregid32(2) | 2.4 | | | |
| t | setresgid(2) | 2.2 | | 分别设置真实的,有效的和保存过的组标识号 | 用户管理 |
| t | setresgid32(2) | 2.4 | | | |
| t | setresuid(2) | 2.2 | | 分别设置真实的,有效的和保存过的用户标识号 | 用户管理 |
| t | setresuid32(2) | 2.4 | | | |
| t | setreuid(2) | 1 | | 分别设置真实和有效的用户标识号 | 用户管理 |
| t | setreuid32(2) | 2.4 | | | |
| | setrlimit(2) | 1 | | 设置系统资源上限 | 系统控制 |
| | setsid(2) | 1 | | 设置会晤标识号 | 进程控制 |
| | setsockopt(2) | 2 | See notes on socketcall(2) | 设置端口参数 | socket控制 |
| | settimeofday(2) | 1 | | 设置时间和时区 | 系统控制 |
| t | setuid(2) | 1 | | 设置用户标志号 | 用户管理 |
| t | setuid32(2) | 2.4 | | | |
| | setup(2) | 1 | Removed in 2.2 | | |
| | setxattr(2) | 2.6; 2.4.18 | | | |
| | sgetmask(2) | 1 | | | |
| | shmat(2) | 2 | See notes on ipc(2) | 连接共享内存 | 进程间通信 |
| | shmctl(2) | 2 | See notes on ipc(2) | 控制共享内存 | 进程间通信 |
| | shmdt(2) | 2 | See notes on ipc(2) | 拆卸共享内存 | 进程间通信 |
| | shmget(2) | 2 | See notes on ipc(2) | 获取共享内存 | 进程间通信 |
| | shutdown(2) | 2 | See notes on socketcall(2) | 关闭socket上的连接 | socket控制 |
| | sigaction(2) | 1 | | 设置对指定信号的处理方法 | 进程间通信 |
| | sigaltstack(2) | 2.2 | | | |
| | signal(2) | 1 | | 参见signal | 进程间通信 |
| | signalfd(2) | 2.6.22 | | | |
| | signalfd4(2) | 2.6.27 | | | |
| | sigpending(2) | 1 | | 为指定的被阻塞信号设置队列 | 进程间通信 |
| | sigprocmask(2) | 1 | | 根据参数对信号集中的信号执行阻塞/解除阻塞等操作 | 进程间通信 |
| | sigreturn(2) | 1 | | | |
| | sigsuspend(2) | 1 | | 挂起进程等待特定信号 | 进程间通信 |
| | socket(2) | 2 | See notes on socketcall(2) | 建立socket | socket控制 |
| | socketcall(2) | 1 | | socket系统调用 | socket控制 |
| | socketpair(2) | 2 | See notes on socketcall(2) | 创建一对已联接的无名socket | socket控制 |
| | spill(2) | 2.6.13 | Xtensa only | | |
| | splice(2) | 2.6.17 | | | |
| | spu_create(2) | 2.6.16 | PowerPC/PowerPC64 only | | |
| | spu_run(2) | 2.6.16 | PowerPC/PowerPC64 only | | |
| | sram_alloc(2) | 2.6.22 | Blackfin (port removed in Linux 4.17) | | |
| | sram_free(2) | 2.6.22 | Blackfin (port removed in Linux 4.17) | | |
| | ssetmask(2) | 1 | | ANSI C的信号处理函数,作用类似sigaction | 进程间通信 |
| t | stat(2) | 1 | | 取文件状态信息 | 文件系统控制 |
| t | stat64(2) | 2.4 | | | |
| t | statfs(2) | 1 | | 取文件系统信息 | 文件系统控制 |
| t | statfs64(2) | 2.6 | | | |
| | statx(2) | 4.11 | | | |
| | stime(2) | 1 | | 设置系统日期和时间 | 系统控制 |
| | subpage_prot(2) | 2.6.25 | PowerPC/PowerPC64 only | | |
| t | swapcontext(2) | 2.6.3 | PowerPC/PowerPC64 only | | |
| t | swapcontext(2) | 2.6.3 | PowerPC only | | |
| | swapoff(2) | 1 | | 关闭交换文件和设备 | 系统控制 |
| | swapon(2) | 1 | | 打开交换文件和设备 | 系统控制 |
| | switch_endian(2) | 4.1 | PowerPC64 only | | |
| | symlink(2) | 1 | | 创建符号链接 | 文件系统控制 |
| | symlinkat(2) | 2.6.16 | | | |
| t | sync_file_range(2) | 2.6.17 | | | |
| t | sync_file_range2(2) | 2.6.22 | | | |
| | sync(2) | 1 | | 将内存缓冲区数据写回硬盘 | 内存管理 |
| | syncfs(2) | 2.6.39 | | | |
| | sys_debug_setcontext(2) | 2.6.11 | PowerPC only | | |
| | syscall(2) | 1 | Still available on ARM OABI and MIPS O32 ABI | | |
| | sysfs(2) | 1.2 | | 取核心支持的文件系统类型 | 系统控制 |
| | sysinfo(2) | 1 | | 取得系统信息 | 系统控制 |
| | syslog(2) | 1 | | | |
| | sysmips(2) | 2.6.0 | MIPS only | | |
| | tee(2) | 2.6.17 | | | |
| | tgkill(2) | 2.6 | | | |
| | time(2) | 1 | | 取得系统时间 | 系统控制 |
| | timer_create(2) | 2.6 | | | |
| | timer_delete(2) | 2.6 | | | |
| | timer_getoverrun(2) | 2.6 | | | |
| | timer_gettime(2) | 2.6 | | | |
| | timer_settime(2) | 2.6 | | | |
| | timerfd_create(2) | 2.6.25 | | | |
| | timerfd_gettime(2) | 2.6.25 | | | |
| | timerfd_settime(2) | 2.6.25 | | | |
| | times(2) | 1 | | 取进程运行时间 | 系统控制 |
| | tkill(2) | 2.6; 2.4.22 | | | |
| t | truncate(2) | 1 | | 截断文件 | 文件系统控制 |
| t | truncate64(2) | 2.4 | | | |
| | ugetrlimit(2) | 2.4 | | | |
| | umask(2) | 1 | | 设置文件权限掩码 | 文件系统控制 |
| | umount(2) | 1 | | 卸下文件系统 | 文件系统控制 |
| | umount2(2) | 2.2 | | | |
| | uname(2) | 1 | | 获取当前UNIX系统的名称、版本和主机等信息 | 系统控制 |
| | unlink(2) | 1 | | 删除链接 | 文件系统控制 |
| | unlinkat(2) | 2.6.16 | | | |
| | unshare(2) | 2.6.16 | | | |
| | uselib(2) | 1 | | 选择要使用的二进制函数库 | 系统控制 |
| | userfaultfd(2) | 4.3 | | | |
| t | usr26(2) | 2.4.8.1 | ARM OABI only | | |
| t | usr32(2) | 2.4.8.1 | ARM OABI only | | |
| | ustat(2) | 1 | | 取文件系统信息 | 文件系统控制 |
| | utime(2) | 1 | | 改变文件的访问修改时间 | 文件系统控制 |
| | utimensat(2) | 2.6.22 | | | |
| | utimes(2) | 2.2 | | 参见utime | 文件系统控制 |
| | utrap_install(2) | 2.2 | SPARC64 only | | |
| | vfork(2) | 2.2 | | 创建一个子进程, 以供执行新程序, 常与execve等同时使用 | 进程控制 |
| | vhangup(2) | 1 | | 挂起当前终端 | 系统控制 |
| t | vm86(2) | 2.0.28; 2.2 | | 进入模拟8086模式 | 系统控制 |
| t | vm86old(2) | 1 | Was "vm86"; renamed in 2.0.28/2.2 | | |
| | vmsplice(2) | 2.6.17 | | | |
| | wait4(2) | 1 | | 参见waitpid | 进程控制 |
| | waitid(2) | 2.6.10 | | | |
| | waitpid(2) | 1 | | 等待指定子进程终止 | 进程控制 |
| | write(2) | 1 | | 写文件 | 文件系统控制 |
| | writev(2) | 2 | | 将缓冲数组里的数据写入文件 | 文件系统控制 |
| | xtensa(2) | 2.6.13 | Xtensa only | | |
3. 使用 strace 跟踪系统调用
摘录自: 使用Linux系统调用的内核命令, IBM developerWorks
原文 P:2007-03-21 Updata:2018-08-20; 译文 P:2010-09-21
https://developer.ibm.com/technologies/linux/tutorials/l-system-calls/
https://www.ibm.com/developerworks/cn/linux/l-system-calls/index.html
使用 strace 跟踪系统调用
Linux 内核提供了一种非常有用的方法来跟踪某个进程所调用的系统调用(以及该进程所接收到的信号)。这个工具就是 strace, 它可以在命令行中执行, 使用希望跟踪的应用程序作为参数。例如, 如果您希望了解在执行 date 命令时都执行了哪些系统调用, 可以键入下面的命令:
$ strace date
结果会产生大量信息, 显示在执行 date 命令过程中所执行的各个系统调用。您会看到加载共享库、映射内存, 最后跟踪到的是在标准输出中生成日期信息:
...
write(1, "2020-06-17T22:26:50 CST\n", 24) = 24
...
4. See also
Linux syscalls 手册 提供了 Linux 中可以使用的系统调用的完整列表。
https://linux.die.net/man/2/syscalls
https://en.wikipedia.org/wiki/Linux_kernel_interfaces#Linux_API