linux strace工具使用手册

strace工具使用手册

参考链接
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观察这些系统调用及其参数、返回值,界定出错的范围,甚至找出问题出现的根因。

  • 操作系统内核直接运行在硬件上,提供设备管理、内存管理、任务调度等功能。
  • 用户空间通过API请求内核空间的服务来完成其功能——内核提供给用户空间的这些API, 就是系统调用。

​ 进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。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

二、用法

2.1 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即可。

2.2 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使用案例

3.1 跟踪程序运行

strace用法举例,测试程序test1.c运行过程中的系统调用情况:

  1 #include <stdio.h>
  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选项,可以打印调用了哪些系统函数,调用多少次数,消耗了多少时间等信息 ,用于性能分析。

这里写图片描述

3.2 分析程序挂死原因

​ test2.c代码使用死循环模拟用户态挂死,调用sleep模拟内核态程序挂死,然后利用strace工具分析原因。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

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手册,了解在什么情况下该系统调用会出现挂死情况。

3.3 跟踪查看依赖库问题

​ 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函数对应 。

3.4 跟踪程序退出的系统调用

​ 利用strace跟踪观察程序正常退出时的系统调用情况

#include <stdio.h>
#include <stdlib.h>

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前面的下划线), 线程退出时最终会调用它。

3.5 定位共享内存异常

​ 当遇到服务启动时报错:

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错误码的原因为下列之一:

  • 要创建的共享内存段比 SHMMIN小 (一般是1个字节)
  • 要创建的共享内存段比 SHMMAX 大 (内核参数kernel.shmmax配置)
  • 指定key的共享内存段已存在,其大小和调用shmget时传递的值不同。

从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 设置主机名称

⑥socket控制

系统调用名称 功能
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中定义并不一致。

猜你喜欢

转载自blog.csdn.net/qq_35782149/article/details/90021655