参考链接
https://blog.csdn.net/jctian000/article/details/80695025
https://blog.51cto.com/10541556/1793898
https://blog.csdn.net/flyingqr/article/details/70598693
Strace是Linux中一个调试和跟踪工具。它可以接管被跟踪进程执行的系统调用和收到的信号。然后把每一个执行的系统调用的名字,参数和返回值打印出来。可以通过strace找到问题出现在user层还是kernel层。strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
strace命令是一个集诊断、调试、统计于一体的工具,使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析 ,以达到解决问题或者了解应用工作过程的目的。有时错误日志不能满足定位问题的需求,因此需要从更“深层”的方面着手分析,可以通过strace观察这些系统调用及其参数、返回值,界定出错的范围,甚至找出问题出现的根因。
进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 对于运维的问题定位,strace工具结合系统调用表,就能解决绝大多数问题。 strace工具比较高级的用途:
1)可以对特定的系统调用或者几组系统调用进行过滤
2)可以通过统计特定系统调用的调用次数、耗费的时间、成功和失败的次数来配置(profile)系统调用的使用
3)可以跟踪发送给进程的信号量
4)可以通过pid附着(attach)到任何运行的进程
Linux内核目前有300多个系统调用,详细的列表可以通过syscalls手册页查看。这些系统调用主要分为几类:
1)文件和设备访问类 比如open/close/read/write/chmod等
2)进程管理类 fork/clone/execve/exit/getpid等
3)信号类 signal/sigaction/kill 等
4)内存管理 brk/mmap/mlock等
5)进程间通信 IPC shmget/semget * 信号量,共享内存,消息队列等
6)网络通信 socket/connect/sendto/sendmsg 等
7)其他
关于该命令的更多信息可以参考帮助文档:man strace
①一种是通过它启动要跟踪的进程 ,在原本的命令前加上strace即可 ,例如:要跟踪 “ls -lh /var/log/messages” 这个命令的执行,可以这样:
strace ls -lh /var/log/messages
②另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下, 即可查看进程的运行情况,给strace传递-p pid 选项。例如:有个在运行的some_server服务,第一步,查看pid:
pidof some_server
17553
依据pid用strace跟踪其执行:
strace -p 17553
完成跟踪时,按ctrl + C 结束strace即可。
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 除了跟踪当前进程外,还跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针寄存器值.
-q 禁止输出关于结合(attaching)、脱离(detaching)的消息,当输出重定向到一个文件时,自动抑制此类消息.
-r 打印出相对时间关于每一个系统调用,即连续的系统调用起点之间的时间差,与-t对应.
-t 打印各个系统调用被调用时的绝对时间秒级,观察程序各部分的执行时间可以用此选项。
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 在每行输出前添加相对时间信息,格式为”自纪元时间起经历的秒数.微秒数”
-T 显示每一调用所耗的时间,其时间开销在输出行最右侧的尖括号内.
-v 冗余显示模式:显示系统调用中argv[]envp[]stat、termio(s)等数组/结构体参数所有的元素/成员内容.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串 。
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认为40,即"="出现在第40列.
-e expr 指定一个表达式,用来控制如何跟踪.
-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e trace=signal 跟踪所有与系统信号有关的 系统调用
-e trace=ipc 跟踪所有与进程通讯有关的系统调用
-e abbrev=set 设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指 定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如signal=!SIGIO,表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5 -e write=set
-E var 从命令的环境变量列表中移除var。
-E var=val 将var=val放入命令的环境变量列表.
-o filename 将strace的输出写入文件filename,而不是显示到标准错误输出(stderr).
-p pid 跟踪指定的进程pid,可指定多达32个(-p pid)选项以同时跟踪多个进程。该选项常用于调试后台进程.
-s strsize 限制每行输出中字符串(如read参数)的最大显示长度,默认32字节。但文件名总是完整显示
-S sortby 按指定规则对-c选项的输出直方图进行排序。sortby取值可为time、calls、name和nothing(默认 time)
-u username 以username 的UID和GID执行被跟踪的命令
以上部分参数可组合使用,如:
strace -o output.txt -T -tt -e trace=all -p 28979
表示的含义是,跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。
strace记录程序所产生的每次系统调用,并以类似C的格式(无论创建该程序时使用何种编程语言)各自显示为单独的一行。每行起始为系统调用的函数名,括号内为参数,该调用的返回值则显示在等号右侧。当参数为数组或结构体时,显示其元素(方括号)或成员(花括号)内容,见execve和fstat64。当参数为bit时,使用方括号并用空格隔开每项参数,如:
sigprocmask(SIG_BLOCK,[CHLD TTOU],[ ]) = 0
第二个参数代表信号SIGCHLD和SIGTTOU;若bit型参数全部置位,则输出如:
sigprocmask(SIG_UNBLOCK,~[ ],NULL) = 0
此处第二个参数全部置位。
strace用法举例,测试程序test1.c运行过程中的系统调用情况:
1 #include
2 int main(void)
3 {
4 fputs("hello", stdout);
5 sleep(2);
6 //这里一开始输出了换行符,所以前面的hello就被输出到屏幕上了。
7 fputs("\nworld\n", stdout);
8 sleep(2);
9 return 0;
10 }
@Cpl-WH-30:~/test$ gcc test1.c -o test1
@Cpl-WH-30:~/test$ strace ./test1
execve("./test1", ["./test1"], [/* 30 vars */]) = 0
brk(0) = 0x12b7000
...
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=143984, ...}) = 0
mmap(NULL, 143984, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7feee4d32000
close(3) = 0
...
fstat(1, {st_mode=S_IFCHR|0622, st_rdev=makedev(136, 14), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feee4d55000
...
nanosleep({2, 0}, 0x7ffd00227380) = 0
write(1, "hello\n", 6hello
) = 6
...
nanosleep({2, 0}, 0x7ffd00227380) = 0
write(1, "world", 5world) = 5
exit_group(0) = ?
+++ exited with 0 +++
第3行表示通过系统调用execve来建立一个进程,本例中为test1对应的进程,在控制台中执行各种命令,比如ls、cd时,都是通过系统调用execve来建立它们的进程的,通过strace可以看到程序运行的细节。
第4行brk通过传递的addr来重新设置program break,成功则返回0,否则返回-1。 brk(0)的参数是一个地址,假如已经知道了堆的起始地址,还有堆的大小,那么就可以据此修改 brk() 中的地址参数已达到调整堆的目的。以0作为参数调用brk,返回值为内存管理的起始地址(若在子进程中调用malloc,则从0x8a92000地址开始分配空间)
第6~8行表示打开动态连接库的过程,如果程序是静态连接的,这几个步骤将不需要。
第14~19行是程序的处理过程,nanosleep()使得进程进入睡眠状态,指定时候后唤醒进程,sleep()基于其实现 ,然后写入hello和world。
20~21行表示退出进程中所有的线程。
(省略号表示还有其他的系统调用,此处省略。)
加入-c选项,可以打印调用了哪些系统函数,调用多少次数,消耗了多少时间等信息 ,用于性能分析。
test2.c代码使用死循环模拟用户态挂死,调用sleep模拟内核态程序挂死,然后利用strace工具分析原因。
#include
#include
#include
#include
int main(int argc, char** argv)
{
getpid(); //该系统调用起到标识作用
if(argc < 2)
{
printf("hang (user|system)\n");
return 1;
}
if(!strcmp(argv[1], "user"))
while(1);
else if(!strcmp(argv[1], "system"))
sleep(500);
return 0;
}
...
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P \2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1857312, ...}) = 0
...
close(3) = 0
...
munmap(0x7f21e695f000, 143984) = 0
getpid() = 8446
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({500, 0},
第3行,调用read,从/lib/i386-linux-gnu/libc.so.6该libc库文件中读取832bytes,即读取ELF头信息 。
分析:用户态挂死情况下,strace在getpid()一行输出之后没有其他系统调用输出;进程在内核态挂死,最后一行的系统调用nanosleep不能完整显示,这里nanosleep没有返回值表示该调用尚未完成。
结论:使用strace跟踪挂死程序,如果最后一行系统调用显示完整,程序在逻辑代码处挂死;如果最后一行系统调用显示不完整,程序在该系统调用处挂死。 当程序挂死在系统调用处,可以查看相应系统调用的man手册,了解在什么情况下该系统调用会出现挂死情况。
strace帮助查看库依赖问题。
@Cpl-WH-30:~/test$ strace -o whoami.strace whoami
@Cpl-WH-30:~/test$ ls
test3 test3.c whoami.strace
@Cpl-WH-30:~/test$ vim whoami.strace
execve("/usr/bin/whoami", ["whoami"], [/* 30 vars */]) = 0
brk(0) = 0x21d4000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1519345000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=143984, ...}) = 0
mmap(NULL, 143984, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1519321000
close(3) = 0
...
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P \2\0\0\0\0\0"..., 832) = 832
...
mprotect(0x7f1519347000, 4096, PROT_READ) = 0
munmap(0x7f1519321000, 143984) = 0
brk(0) = 0x21d4000
brk(0x21f5000) = 0x21f5000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
...
第5行,对于命令行下执行的程序,execve(或exec系列调用中的某一个)均为strace输出系统调用中的第一个。strace首先调用fork或clone函数新建一个子进程,然后在子进程中调用exec载入需要执行的程序(这里为whoami) ;
第6行,以0作为参数调用brk,返回值为内存管理的起始地址(若在子进程中调用malloc,则从0x21d4000地址开始分配空间) ;
第7行,调用access函数检验/etc/ld.so.nohwcap是否存在 ;
第8行,使用mmap函数进行匿名内存映射,以此来获取8192bytes内存空间,该空间起始地址为0x7f1519345000,匿名内存映射就是不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信 。
第10行,调用open函数尝试打开/etc/ld.so.cache文件,返回文件描述符为3 。
第11行,fstat函数获取/etc/ld.so.cache文件信息 。
第12行,调用mmap函数将/etc/ld.so.cache文件映射至内存 。
第13行,close关闭文件描述符为3指向的/etc/ld.so.cache文件 。
第18行,使用mprotect函数对0x7f1519347000,起始的4096bytes空间进行保护(PROT_NONE参数就是不能访问,对应还有PROT_READ表示可以读取) 。
第19行,调用munmap函数,将/etc/ld.so.cache文件从内存中去映射,与8行的mmap函数对应 。
利用strace跟踪观察程序正常退出时的系统调用情况
#include
#include
int main(int argc, char **argv) {
exit(1);
}
-e trace=process 表示只跟踪和进程管理相关的系统调用。
进程自己退出时(调用exit函数,或者从main函数返回), 最终调用的是exit_group系统调用, 并且strace会输出exited with X(X为退出码)。
因为这里的exit函数不是系统调用,而是glibc库提供的一个函数,exit函数的调用最终会转化为exit_group系统调用,它会退出当前进程的所有线程。实际上,有一个叫做_exit()的系统调用(注意exit前面的下划线), 线程退出时最终会调用它。
当遇到服务启动时报错:
shmget 267264 30097568: Invalid argument
Can not get shm...exit!
错误日志提示获取共享内存出错,通过strace看下 :
-WH-30:~/$ strace -tt -f -e trace=ipc ./a_mon_svr ../conf/a_mon_svr.conf
22:46:36.351798 shmget(0x5feb, 12000, 0666) = 0
22:46:36.351939 shmat(0, 0, 0) = ?
Process 21406 attached
22:46:36.355439 shmget(0x41400, 30097568, 0666) = -1 EINVAL (Invalid argument)
shmget 267264 30097568: Invalid argument
Can not get shm...exit!
通过-e trace=ipc 选项,让strace只跟踪和进程通信相关的系统调用。
从strace输出得知是shmget系统调用出错了,errno是EINVAL。同样, 查询下shmget手册页,搜索EINVAL的错误码的说明:
EINVAL A new segment was to be created and size < SHMMIN or size > SHMMAX, or no new segment was to be created, a segment with given key existed, but size is greater than the size of that segment
shmget设置EINVAL错误码的原因为下列之一:
从strace输出看,要连的共享内存key 0x41400, 指定的大小是30097568字节,明显与第1、2种情况不匹配。那只剩下第三种情况。使用ipcs看下是否真的是大小不匹配:
ipcs -m | grep 41400
key shmid owner perms bytes nattch status
0x00041400 1015822 root 666 30095516 1
可以看到,已经0x41400这个key已经存在,并且其大小为30095516字节,和我们调用参数中的30097568不匹配,于是产生了这个错误。在这个案例里面,导致共享内存大小不一致的原因,是一组程序中,其中一个编译为32位,另外一个编译为64位,代码里面使用了long这个变长int数据类型。
注意:当目标进程卡死在用户态时,strace会没有输出 ,此时需要其他的跟踪手段,比如gdb/perf/SystemTap等。
strace工具的功能还有很多,此处不一一列出,具体用法参照2.2节常用选项说明使用。
以下是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 |
_sysctl |
acct |
getrlimit |
setrlimit |
getrusage |
uselib |
ioperm |
iopl |
outb |
reboot |
swapon |
swapoff |
bdflush |
sysfs |
sysinfo |
adjtimex |
alarm |
getitimer |
setitimer |
gettimeofday |
settimeofday |
stime |
time |
times |
uname |
vhangup |
nfsservctl |
vm86 |
create_module |
delete_module |
init_module |
query_module |
*get_kernel_syms |
brk |
sbrk |
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 | 进程间通信总控制调用 |
信号
系统调用名称 | 功能 |
---|---|
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 | 拆卸共享内存 |
系统调用号 | 函数名 | 入口点 | 源代码 |
---|---|---|---|
0 | read | sys_read | fs/read_write.c |
1 | write | sys_write | fs/read_write.c |
2 | open | sys_open | fs/open.c |
3 | close | sys_close | fs/open.c |
4 | stat | sys_newstat | fs/stat.c |
5 | fstat | sys_newfstat | fs/stat.c |
6 | lstat | sys_newlstat | fs/stat.c |
7 | poll | sys_poll | fs/select.c |
8 | lseek | sys_lseek | fs/read_write.c |
9 | mmap | sys_mmap | arch/x86/kernel/sys_x86_64.c |
10 | mprotect | sys_mprotect | mm/mprotect.c |
11 | munmap | sys_munmap | mm/mmap.c |
12 | brk | sys_brk | mm/mmap.c |
13 | rt_sigaction | sys_rt_sigaction | kernel/signal.c |
14 | rt_sigprocmask | sys_rt_sigprocmask | kernel/signal.c |
15 | rt_sigreturn | stub_rt_sigreturn | arch/x86/kernel/signal.c |
16 | ioctl | sys_ioctl | fs/ioctl.c |
17 | pread64 | sys_pread64 | fs/read_write.c |
18 | pwrite64 | sys_pwrite64 | fs/read_write.c |
19 | readv | sys_readv | fs/read_write.c |
20 | writev | sys_writev | fs/read_write.c |
21 | access | sys_access | fs/open.c |
22 | pipe | sys_pipe | fs/pipe.c |
23 | select | sys_select | fs/select.c |
24 | sched_yield | sys_sched_yield | kernel/sched/core.c |
25 | mremap | sys_mremap | mm/mmap.c |
26 | msync | sys_msync | mm/msync.c |
27 | mincore | sys_mincore | mm/mincore.c |
28 | madvise | sys_madvise | mm/madvise.c |
29 | shmget | sys_shmget | ipc/shm.c |
30 | shmat | sys_shmat | ipc/shm.c |
31 | shmctl | sys_shmctl | ipc/shm.c |
32 | dup | sys_dup | fs/file.c |
33 | dup2 | sys_dup2 | fs/file.c |
34 | pause | sys_pause | kernel/signal.c |
35 | nanosleep | sys_nanosleep | kernel/hrtimer.c |
36 | getitimer | sys_getitimer | kernel/itimer.c |
37 | alarm | sys_alarm | kernel/timer.c |
38 | setitimer | sys_setitimer | kernel/itimer.c |
39 | getpid | sys_getpid | kernel/sys.c |
40 | sendfile | sys_sendfile64 | fs/read_write.c |
41 | socket | sys_socket | net/socket.c |
42 | connect | sys_connect | net/socket.c |
43 | accept | sys_accept | net/socket.c |
44 | sendto | sys_sendto | net/socket.c |
45 | recvfrom | sys_recvfrom | net/socket.c |
46 | sendmsg | sys_sendmsg | net/socket.c |
47 | recvmsg | sys_recvmsg | net/socket.c |
48 | shutdown | sys_shutdown | net/socket.c |
49 | bind | sys_bind | net/socket.c |
50 | listen | sys_listen | net/socket.c |
51 | getsockname | sys_getsockname | net/socket.c |
52 | getpeername | sys_getpeername | net/socket.c |
53 | socketpair | sys_socketpair | net/socket.c |
54 | setsockopt | sys_setsockopt | net/socket.c |
55 | getsockopt | sys_getsockopt | net/socket.c |
56 | clone | stub_clone | kernel/fork.c |
57 | fork | stub_fork | kernel/fork.c |
58 | vfork | stub_vfork | kernel/fork.c |
59 | execve | stub_execve | fs/exec.c |
60 | exit | sys_exit | kernel/exit.c |
61 | wait4 | sys_wait4 | kernel/exit.c |
62 | kill | sys_kill | kernel/signal.c |
63 | uname | sys_newuname | kernel/sys.c |
64 | semget | sys_semget | ipc/sem.c |
65 | semop | sys_semop | ipc/sem.c |
66 | semctl | sys_semctl | ipc/sem.c |
67 | shmdt | sys_shmdt | ipc/shm.c |
68 | msgget | sys_msgget | ipc/msg.c |
69 | msgsnd | sys_msgsnd | ipc/msg.c |
70 | msgrcv | sys_msgrcv | ipc/msg.c |
71 | msgctl | sys_msgctl | ipc/msg.c |
72 | fcntl | sys_fcntl | fs/fcntl.c |
73 | flock | sys_flock | fs/locks.c |
74 | fsync | sys_fsync | fs/sync.c |
75 | fdatasync | sys_fdatasync | fs/sync.c |
76 | truncate | sys_truncate | fs/open.c |
77 | ftruncate | sys_ftruncate | fs/open.c |
78 | getdents | sys_getdents | fs/readdir.c |
79 | getcwd | sys_getcwd | fs/dcache.c |
80 | chdir | sys_chdir | fs/open.c |
81 | fchdir | sys_fchdir | fs/open.c |
82 | rename | sys_rename | fs/namei.c |
83 | mkdir | sys_mkdir | fs/namei.c |
84 | rmdir | sys_rmdir | fs/namei.c |
85 | creat | sys_creat | fs/open.c |
86 | link | sys_link | fs/namei.c |
87 | unlink | sys_unlink | fs/namei.c |
88 | symlink | sys_symlink | fs/namei.c |
89 | readlink | sys_readlink | fs/stat.c |
90 | chmod | sys_chmod | fs/open.c |
91 | fchmod | sys_fchmod | fs/open.c |
92 | chown | sys_chown | fs/open.c |
93 | fchown | sys_fchown | fs/open.c |
94 | lchown | sys_lchown | fs/open.c |
95 | umask | sys_umask | kernel/sys.c |
96 | gettimeofday | sys_gettimeofday | kernel/time.c |
97 | getrlimit | sys_getrlimit | kernel/sys.c |
98 | getrusage | sys_getrusage | kernel/sys.c |
99 | sysinfo | sys_sysinfo | kernel/sys.c |
100 | times | sys_times | kernel/sys.c |
101 | ptrace | sys_ptrace | kernel/ptrace.c |
102 | getuid | sys_getuid | kernel/sys.c |
103 | syslog | sys_syslog | kernel/printk/printk.c |
104 | getgid | sys_getgid | kernel/sys.c |
105 | setuid | sys_setuid | kernel/sys.c |
106 | setgid | sys_setgid | kernel/sys.c |
107 | geteuid | sys_geteuid | kernel/sys.c |
108 | getegid | sys_getegid | kernel/sys.c |
109 | setpgid | sys_setpgid | kernel/sys.c |
110 | getppid | sys_getppid | kernel/sys.c |
111 | getpgrp | sys_getpgrp | kernel/sys.c |
112 | setsid | sys_setsid | kernel/sys.c |
113 | setreuid | sys_setreuid | kernel/sys.c |
114 | setregid | sys_setregid | kernel/sys.c |
115 | getgroups | sys_getgroups | kernel/groups.c |
116 | setgroups | sys_setgroups | kernel/groups.c |
117 | setresuid | sys_setresuid | kernel/sys.c |
118 | getresuid | sys_getresuid | kernel/sys.c |
119 | setresgid | sys_setresgid | kernel/sys.c |
120 | getresgid | sys_getresgid | kernel/sys.c |
121 | getpgid | sys_getpgid | kernel/sys.c |
122 | setfsuid | sys_setfsuid | kernel/sys.c |
123 | setfsgid | sys_setfsgid | kernel/sys.c |
124 | getsid | sys_getsid | kernel/sys.c |
125 | capget | sys_capget | kernel/capability.c |
126 | capset | sys_capset | kernel/capability.c |
127 | rt_sigpending | sys_rt_sigpending | kernel/signal.c |
128 | rt_sigtimedwait | sys_rt_sigtimedwait | kernel/signal.c |
129 | rt_sigqueueinfo | sys_rt_sigqueueinfo | kernel/signal.c |
130 | rt_sigsuspend | sys_rt_sigsuspend | kernel/signal.c |
131 | sigaltstack | sys_sigaltstack | kernel/signal.c |
132 | utime | sys_utime | fs/utimes.c |
133 | mknod | sys_mknod | fs/namei.c |
134 | uselib | fs/exec.c | |
135 | personality | sys_personality | kernel/exec_domain.c |
136 | ustat | sys_ustat | fs/statfs.c |
137 | statfs | sys_statfs | fs/statfs.c |
138 | fstatfs | sys_fstatfs | fs/statfs.c |
139 | sysfs | sys_sysfs | fs/filesystems.c |
140 | getpriority | sys_getpriority | kernel/sys.c |
141 | setpriority | sys_setpriority | kernel/sys.c |
142 | sched_setparam | sys_sched_setparam | kernel/sched/core.c |
143 | sched_getparam | sys_sched_getparam | kernel/sched/core.c |
144 | sched_setscheduler | sys_sched_setscheduler | kernel/sched/core.c |
145 | sched_getscheduler | sys_sched_getscheduler | kernel/sched/core.c |
146 | sched_get_priority_max | sys_sched_get_priority_max | kernel/sched/core.c |
147 | sched_get_priority_min | sys_sched_get_priority_min | kernel/sched/core.c |
148 | sched_rr_get_interval | sys_sched_rr_get_interval | kernel/sched/core.c |
149 | mlock | sys_mlock | mm/mlock.c |
150 | munlock | sys_munlock | mm/mlock.c |
151 | mlockall | sys_mlockall | mm/mlock.c |
152 | munlockall | sys_munlockall | mm/mlock.c |
153 | vhangup | sys_vhangup | fs/open.c |
154 | modify_ldt | sys_modify_ldt | arch/x86/um/ldt.c |
155 | pivot_root | sys_pivot_root | fs/namespace.c |
156 | _sysctl | sys_sysctl | kernel/sysctl_binary.c |
157 | prctl | sys_prctl | kernel/sys.c |
158 | arch_prctl | sys_arch_prctl | arch/x86/um/syscalls_64.c |
159 | adjtimex | sys_adjtimex | kernel/time.c |
160 | setrlimit | sys_setrlimit | kernel/sys.c |
161 | chroot | sys_chroot | fs/open.c |
162 | sync | sys_sync | fs/sync.c |
163 | acct | sys_acct | kernel/acct.c |
164 | settimeofday | sys_settimeofday | kernel/time.c |
165 | mount | sys_mount | fs/namespace.c |
166 | umount2 | sys_umount | fs/namespace.c |
167 | swapon | sys_swapon | mm/swapfile.c |
168 | swapoff | sys_swapoff | mm/swapfile.c |
169 | reboot | sys_reboot | kernel/reboot.c |
170 | sethostname | sys_sethostname | kernel/sys.c |
171 | setdomainname | sys_setdomainname | kernel/sys.c |
172 | iopl | stub_iopl | arch/x86/kernel/ioport.c |
173 | ioperm | sys_ioperm | arch/x86/kernel/ioport.c |
174 | create_module | NOT IMPLEMENTED | |
175 | init_module | sys_init_module | kernel/module.c |
176 | delete_module | sys_delete_module | kernel/module.c |
177 | get_kernel_syms | NOT IMPLEMENTED | |
178 | query_module | NOT IMPLEMENTED | |
179 | quotactl | sys_quotactl | fs/quota/quota.c |
180 | nfsservctl | NOT IMPLEMENTED | |
181 | getpmsg | NOT IMPLEMENTED | |
182 | putpmsg | NOT IMPLEMENTED | |
183 | afs_syscall | NOT IMPLEMENTED | |
184 | tuxcall | NOT IMPLEMENTED | |
185 | security | NOT IMPLEMENTED | |
186 | gettid | sys_gettid | kernel/sys.c |
187 | readahead | sys_readahead | mm/readahead.c |
188 | setxattr | sys_setxattr | fs/xattr.c |
189 | lsetxattr | sys_lsetxattr | fs/xattr.c |
190 | fsetxattr | sys_fsetxattr | fs/xattr.c |
191 | getxattr | sys_getxattr | fs/xattr.c |
192 | lgetxattr | sys_lgetxattr | fs/xattr.c |
193 | fgetxattr | sys_fgetxattr | fs/xattr.c |
194 | listxattr | sys_listxattr | fs/xattr.c |
195 | llistxattr | sys_llistxattr | fs/xattr.c |
196 | flistxattr | sys_flistxattr | fs/xattr.c |
197 | removexattr | sys_removexattr | fs/xattr.c |
198 | lremovexattr | sys_lremovexattr | fs/xattr.c |
199 | fremovexattr | sys_fremovexattr | fs/xattr.c |
200 | tkill | sys_tkill | kernel/signal.c |
201 | time | sys_time | kernel/time.c |
202 | futex | sys_futex | kernel/futex.c |
203 | sched_setaffinity | sys_sched_setaffinity | kernel/sched/core.c |
204 | sched_getaffinity | sys_sched_getaffinity | kernel/sched/core.c |
205 | set_thread_area | arch/x86/kernel/tls.c | |
206 | io_setup | sys_io_setup | fs/aio.c |
207 | io_destroy | sys_io_destroy | fs/aio.c |
208 | io_getevents | sys_io_getevents | fs/aio.c |
209 | io_submit | sys_io_submit | fs/aio.c |
210 | io_cancel | sys_io_cancel | fs/aio.c |
211 | get_thread_area | arch/x86/kernel/tls.c | |
212 | lookup_dcookie | sys_lookup_dcookie | fs/dcookies.c |
213 | epoll_create | sys_epoll_create | fs/eventpoll.c |
214 | epoll_ctl_old | NOT IMPLEMENTED | |
215 | epoll_wait_old | NOT IMPLEMENTED | |
216 | remap_file_pages | sys_remap_file_pages | mm/fremap.c |
217 | getdents64 | sys_getdents64 | fs/readdir.c |
218 | set_tid_address | sys_set_tid_address | kernel/fork.c |
219 | restart_syscall | sys_restart_syscall | kernel/signal.c |
220 | semtimedop | sys_semtimedop | ipc/sem.c |
221 | fadvise64 | sys_fadvise64 | mm/fadvise.c |
222 | timer_create | sys_timer_create | kernel/posix-timers.c |
223 | timer_settime | sys_timer_settime | kernel/posix-timers.c |
224 | timer_gettime | sys_timer_gettime | kernel/posix-timers.c |
225 | timer_getoverrun | sys_timer_getoverrun | kernel/posix-timers.c |
226 | timer_delete | sys_timer_delete | kernel/posix-timers.c |
227 | clock_settime | sys_clock_settime | kernel/posix-timers.c |
228 | clock_gettime | sys_clock_gettime | kernel/posix-timers.c |
229 | clock_getres | sys_clock_getres | kernel/posix-timers.c |
230 | clock_nanosleep | sys_clock_nanosleep | kernel/posix-timers.c |
231 | exit_group | sys_exit_group | kernel/exit.c |
232 | epoll_wait | sys_epoll_wait | fs/eventpoll.c |
233 | epoll_ctl | sys_epoll_ctl | fs/eventpoll.c |
234 | tgkill | sys_tgkill | kernel/signal.c |
235 | utimes | sys_utimes | fs/utimes.c |
236 | vserver | NOT IMPLEMENTED | |
237 | mbind | sys_mbind | mm/mempolicy.c |
238 | set_mempolicy | sys_set_mempolicy | mm/mempolicy.c |
239 | get_mempolicy | sys_get_mempolicy | mm/mempolicy.c |
240 | mq_open | sys_mq_open | ipc/mqueue.c |
241 | mq_unlink | sys_mq_unlink | ipc/mqueue.c |
242 | mq_timedsend | sys_mq_timedsend | ipc/mqueue.c |
243 | mq_timedreceive | sys_mq_timedreceive | ipc/mqueue.c |
244 | mq_notify | sys_mq_notify | ipc/mqueue.c |
245 | mq_getsetattr | sys_mq_getsetattr | ipc/mqueue.c |
246 | kexec_load | sys_kexec_load | kernel/kexec.c |
247 | waitid | sys_waitid | kernel/exit.c |
248 | add_key | sys_add_key | security/keys/keyctl.c |
249 | request_key | sys_request_key | security/keys/keyctl.c |
250 | keyctl | sys_keyctl | security/keys/keyctl.c |
251 | ioprio_set | sys_ioprio_set | fs/ioprio.c |
252 | ioprio_get | sys_ioprio_get | fs/ioprio.c |
253 | inotify_init | sys_inotify_init | fs/notify/inotify/inotify_user.c |
254 | inotify_add_watch | sys_inotify_add_watch | fs/notify/inotify/inotify_user.c |
255 | inotify_rm_watch | sys_inotify_rm_watch | fs/notify/inotify/inotify_user.c |
256 | migrate_pages | sys_migrate_pages | mm/mempolicy.c |
257 | openat | sys_openat | fs/open.c |
258 | mkdirat | sys_mkdirat | fs/namei.c |
259 | mknodat | sys_mknodat | fs/namei.c |
260 | fchownat | sys_fchownat | fs/open.c |
261 | futimesat | sys_futimesat | fs/utimes.c |
262 | newfstatat | sys_newfstatat | fs/stat.c |
263 | unlinkat | sys_unlinkat | fs/namei.c |
264 | renameat | sys_renameat | fs/namei.c |
265 | linkat | sys_linkat | fs/namei.c |
266 | symlinkat | sys_symlinkat | fs/namei.c |
267 | readlinkat | sys_readlinkat | fs/stat.c |
268 | fchmodat | sys_fchmodat | fs/open.c |
269 | faccessat | sys_faccessat | fs/open.c |
270 | pselect6 | sys_pselect6 | fs/select.c |
271 | ppoll | sys_ppoll | fs/select.c |
272 | unshare | sys_unshare | kernel/fork.c |
273 | set_robust_list | sys_set_robust_list | kernel/futex.c |
274 | get_robust_list | sys_get_robust_list | kernel/futex.c |
275 | splice | sys_splice | fs/splice.c |
276 | tee | sys_tee | fs/splice.c |
277 | sync_file_range | sys_sync_file_range | fs/sync.c |
278 | vmsplice | sys_vmsplice | fs/splice.c |
279 | move_pages | sys_move_pages | mm/migrate.c |
280 | utimensat | sys_utimensat | fs/utimes.c |
281 | epoll_pwait | sys_epoll_pwait | fs/eventpoll.c |
282 | signalfd | sys_signalfd | fs/signalfd.c |
283 | timerfd_create | sys_timerfd_create | fs/timerfd.c |
284 | eventfd | sys_eventfd | fs/eventfd.c |
285 | fallocate | sys_fallocate | fs/open.c |
286 | timerfd_settime | sys_timerfd_settime | fs/timerfd.c |
287 | timerfd_gettime | sys_timerfd_gettime | fs/timerfd.c |
288 | accept4 | sys_accept4 | net/socket.c |
289 | signalfd4 | sys_signalfd4 | fs/signalfd.c |
290 | eventfd2 | sys_eventfd2 | fs/eventfd.c |
291 | epoll_create1 | sys_epoll_create1 | fs/eventpoll.c |
292 | dup3 | sys_dup3 | fs/file.c |
293 | pipe2 | sys_pipe2 | fs/pipe.c |
294 | inotify_init1 | sys_inotify_init1 | fs/notify/inotify/inotify_user.c |
295 | preadv | sys_preadv | fs/read_write.c |
296 | pwritev | sys_pwritev | fs/read_write.c |
297 | rt_tgsigqueueinfo | sys_rt_tgsigqueueinfo | kernel/signal.c |
298 | perf_event_open | sys_perf_event_open | kernel/events/core.c |
299 | recvmmsg | sys_recvmmsg | net/socket.c |
300 | fanotify_init | sys_fanotify_init | fs/notify/fanotify/fanotify_user.c |
301 | fanotify_mark | sys_fanotify_mark | fs/notify/fanotify/fanotify_user.c |
302 | prlimit64 | sys_prlimit64 | kernel/sys.c |
303 | name_to_handle_at | sys_name_to_handle_at | fs/fhandle.c |
304 | open_by_handle_at | sys_open_by_handle_at | fs/fhandle.c |
305 | clock_adjtime | sys_clock_adjtime | kernel/posix-timers.c |
306 | syncfs | sys_syncfs | fs/sync.c |
307 | sendmmsg | sys_sendmmsg | net/socket.c |
308 | setns | sys_setns | kernel/nsproxy.c |
309 | getcpu | sys_getcpu | kernel/sys.c |
310 | process_vm_readv | sys_process_vm_readv | mm/process_vm_access.c |
311 | process_vm_writev | sys_process_vm_writev | mm/process_vm_access.c |
312 | kcmp | sys_kcmp | kernel/kcmp.c |
313 | finit_module | sys_finit_module | kernel/module.c |
注:系统调用号与unistd.h中定义并不一致。