linux strace工具使用手册

本文详细介绍Strace工具的使用方法和应用场景,Strace是Linux中一个强大的调试和跟踪工具,能够监控进程执行的系统调用和接收的信号。文章涵盖了Strace的安装、基本用法、高级选项以及实际案例分析,帮助读者深入理解系统调用和进程行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strace工具使用手册

下载地址

./configure --prefix=/home/lwc/userapp/rootfs CC=arm-himix100-linux-gcc --host=arm
make
make install

https://blog.youkuaiyun.com/jctian000/article/details/80695025
https://blog.51cto.com/10541556/1793898
https://blog.youkuaiyun.com/flyingqr/article/details/70598693

一、说明

[https://github.com/strace/strace/releases](https://github.com/strace/strace/releases)

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文件加/解锁
pollI/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控制
系统调用名称功能
socketcallsocket系统调用
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
ssetmaskANSI C的信号处理函数,作用类似sigaction

​ 消息

系统调用名称功能
msgctl消息控制操作
msgget获取消息队列
msgsnd发消息
msgrcv取消息

​ 管道

系统调用名称功能
pipe创建管道

​ 信号量

系统调用名称功能
semctl信号量控制
semget获取一组信号量
semop信号量操作

​ 共享内存

系统调用名称功能
shmctl控制共享内存
shmget获取共享内存
shmat连接共享内存
shmdt拆卸共享内存
附录Ⅱ 系统调用入口&源代码
系统调用号函数名入口点源代码
0readsys_readfs/read_write.c
1writesys_writefs/read_write.c
2opensys_openfs/open.c
3closesys_closefs/open.c
4statsys_newstatfs/stat.c
5fstatsys_newfstatfs/stat.c
6lstatsys_newlstatfs/stat.c
7pollsys_pollfs/select.c
8lseeksys_lseekfs/read_write.c
9mmapsys_mmaparch/x86/kernel/sys_x86_64.c
10mprotectsys_mprotectmm/mprotect.c
11munmapsys_munmapmm/mmap.c
12brksys_brkmm/mmap.c
13rt_sigactionsys_rt_sigactionkernel/signal.c
14rt_sigprocmasksys_rt_sigprocmaskkernel/signal.c
15rt_sigreturnstub_rt_sigreturnarch/x86/kernel/signal.c
16ioctlsys_ioctlfs/ioctl.c
17pread64sys_pread64fs/read_write.c
18pwrite64sys_pwrite64fs/read_write.c
19readvsys_readvfs/read_write.c
20writevsys_writevfs/read_write.c
21accesssys_accessfs/open.c
22pipesys_pipefs/pipe.c
23selectsys_selectfs/select.c
24sched_yieldsys_sched_yieldkernel/sched/core.c
25mremapsys_mremapmm/mmap.c
26msyncsys_msyncmm/msync.c
27mincoresys_mincoremm/mincore.c
28madvisesys_madvisemm/madvise.c
29shmgetsys_shmgetipc/shm.c
30shmatsys_shmatipc/shm.c
31shmctlsys_shmctlipc/shm.c
32dupsys_dupfs/file.c
33dup2sys_dup2fs/file.c
34pausesys_pausekernel/signal.c
35nanosleepsys_nanosleepkernel/hrtimer.c
36getitimersys_getitimerkernel/itimer.c
37alarmsys_alarmkernel/timer.c
38setitimersys_setitimerkernel/itimer.c
39getpidsys_getpidkernel/sys.c
40sendfilesys_sendfile64fs/read_write.c
41socketsys_socketnet/socket.c
42connectsys_connectnet/socket.c
43acceptsys_acceptnet/socket.c
44sendtosys_sendtonet/socket.c
45recvfromsys_recvfromnet/socket.c
46sendmsgsys_sendmsgnet/socket.c
47recvmsgsys_recvmsgnet/socket.c
48shutdownsys_shutdownnet/socket.c
49bindsys_bindnet/socket.c
50listensys_listennet/socket.c
51getsocknamesys_getsocknamenet/socket.c
52getpeernamesys_getpeernamenet/socket.c
53socketpairsys_socketpairnet/socket.c
54setsockoptsys_setsockoptnet/socket.c
55getsockoptsys_getsockoptnet/socket.c
56clonestub_clonekernel/fork.c
57forkstub_forkkernel/fork.c
58vforkstub_vforkkernel/fork.c
59execvestub_execvefs/exec.c
60exitsys_exitkernel/exit.c
61wait4sys_wait4kernel/exit.c
62killsys_killkernel/signal.c
63unamesys_newunamekernel/sys.c
64semgetsys_semgetipc/sem.c
65semopsys_semopipc/sem.c
66semctlsys_semctlipc/sem.c
67shmdtsys_shmdtipc/shm.c
68msggetsys_msggetipc/msg.c
69msgsndsys_msgsndipc/msg.c
70msgrcvsys_msgrcvipc/msg.c
71msgctlsys_msgctlipc/msg.c
72fcntlsys_fcntlfs/fcntl.c
73flocksys_flockfs/locks.c
74fsyncsys_fsyncfs/sync.c
75fdatasyncsys_fdatasyncfs/sync.c
76truncatesys_truncatefs/open.c
77ftruncatesys_ftruncatefs/open.c
78getdentssys_getdentsfs/readdir.c
79getcwdsys_getcwdfs/dcache.c
80chdirsys_chdirfs/open.c
81fchdirsys_fchdirfs/open.c
82renamesys_renamefs/namei.c
83mkdirsys_mkdirfs/namei.c
84rmdirsys_rmdirfs/namei.c
85creatsys_creatfs/open.c
86linksys_linkfs/namei.c
87unlinksys_unlinkfs/namei.c
88symlinksys_symlinkfs/namei.c
89readlinksys_readlinkfs/stat.c
90chmodsys_chmodfs/open.c
91fchmodsys_fchmodfs/open.c
92chownsys_chownfs/open.c
93fchownsys_fchownfs/open.c
94lchownsys_lchownfs/open.c
95umasksys_umaskkernel/sys.c
96gettimeofdaysys_gettimeofdaykernel/time.c
97getrlimitsys_getrlimitkernel/sys.c
98getrusagesys_getrusagekernel/sys.c
99sysinfosys_sysinfokernel/sys.c
100timessys_timeskernel/sys.c
101ptracesys_ptracekernel/ptrace.c
102getuidsys_getuidkernel/sys.c
103syslogsys_syslogkernel/printk/printk.c
104getgidsys_getgidkernel/sys.c
105setuidsys_setuidkernel/sys.c
106setgidsys_setgidkernel/sys.c
107geteuidsys_geteuidkernel/sys.c
108getegidsys_getegidkernel/sys.c
109setpgidsys_setpgidkernel/sys.c
110getppidsys_getppidkernel/sys.c
111getpgrpsys_getpgrpkernel/sys.c
112setsidsys_setsidkernel/sys.c
113setreuidsys_setreuidkernel/sys.c
114setregidsys_setregidkernel/sys.c
115getgroupssys_getgroupskernel/groups.c
116setgroupssys_setgroupskernel/groups.c
117setresuidsys_setresuidkernel/sys.c
118getresuidsys_getresuidkernel/sys.c
119setresgidsys_setresgidkernel/sys.c
120getresgidsys_getresgidkernel/sys.c
121getpgidsys_getpgidkernel/sys.c
122setfsuidsys_setfsuidkernel/sys.c
123setfsgidsys_setfsgidkernel/sys.c
124getsidsys_getsidkernel/sys.c
125capgetsys_capgetkernel/capability.c
126capsetsys_capsetkernel/capability.c
127rt_sigpendingsys_rt_sigpendingkernel/signal.c
128rt_sigtimedwaitsys_rt_sigtimedwaitkernel/signal.c
129rt_sigqueueinfosys_rt_sigqueueinfokernel/signal.c
130rt_sigsuspendsys_rt_sigsuspendkernel/signal.c
131sigaltstacksys_sigaltstackkernel/signal.c
132utimesys_utimefs/utimes.c
133mknodsys_mknodfs/namei.c
134uselibfs/exec.c
135personalitysys_personalitykernel/exec_domain.c
136ustatsys_ustatfs/statfs.c
137statfssys_statfsfs/statfs.c
138fstatfssys_fstatfsfs/statfs.c
139sysfssys_sysfsfs/filesystems.c
140getprioritysys_getprioritykernel/sys.c
141setprioritysys_setprioritykernel/sys.c
142sched_setparamsys_sched_setparamkernel/sched/core.c
143sched_getparamsys_sched_getparamkernel/sched/core.c
144sched_setschedulersys_sched_setschedulerkernel/sched/core.c
145sched_getschedulersys_sched_getschedulerkernel/sched/core.c
146sched_get_priority_maxsys_sched_get_priority_maxkernel/sched/core.c
147sched_get_priority_minsys_sched_get_priority_minkernel/sched/core.c
148sched_rr_get_intervalsys_sched_rr_get_intervalkernel/sched/core.c
149mlocksys_mlockmm/mlock.c
150munlocksys_munlockmm/mlock.c
151mlockallsys_mlockallmm/mlock.c
152munlockallsys_munlockallmm/mlock.c
153vhangupsys_vhangupfs/open.c
154modify_ldtsys_modify_ldtarch/x86/um/ldt.c
155pivot_rootsys_pivot_rootfs/namespace.c
156_sysctlsys_sysctlkernel/sysctl_binary.c
157prctlsys_prctlkernel/sys.c
158arch_prctlsys_arch_prctlarch/x86/um/syscalls_64.c
159adjtimexsys_adjtimexkernel/time.c
160setrlimitsys_setrlimitkernel/sys.c
161chrootsys_chrootfs/open.c
162syncsys_syncfs/sync.c
163acctsys_acctkernel/acct.c
164settimeofdaysys_settimeofdaykernel/time.c
165mountsys_mountfs/namespace.c
166umount2sys_umountfs/namespace.c
167swaponsys_swaponmm/swapfile.c
168swapoffsys_swapoffmm/swapfile.c
169rebootsys_rebootkernel/reboot.c
170sethostnamesys_sethostnamekernel/sys.c
171setdomainnamesys_setdomainnamekernel/sys.c
172ioplstub_ioplarch/x86/kernel/ioport.c
173iopermsys_iopermarch/x86/kernel/ioport.c
174create_moduleNOT IMPLEMENTED
175init_modulesys_init_modulekernel/module.c
176delete_modulesys_delete_modulekernel/module.c
177get_kernel_symsNOT IMPLEMENTED
178query_moduleNOT IMPLEMENTED
179quotactlsys_quotactlfs/quota/quota.c
180nfsservctlNOT IMPLEMENTED
181getpmsgNOT IMPLEMENTED
182putpmsgNOT IMPLEMENTED
183afs_syscallNOT IMPLEMENTED
184tuxcallNOT IMPLEMENTED
185securityNOT IMPLEMENTED
186gettidsys_gettidkernel/sys.c
187readaheadsys_readaheadmm/readahead.c
188setxattrsys_setxattrfs/xattr.c
189lsetxattrsys_lsetxattrfs/xattr.c
190fsetxattrsys_fsetxattrfs/xattr.c
191getxattrsys_getxattrfs/xattr.c
192lgetxattrsys_lgetxattrfs/xattr.c
193fgetxattrsys_fgetxattrfs/xattr.c
194listxattrsys_listxattrfs/xattr.c
195llistxattrsys_llistxattrfs/xattr.c
196flistxattrsys_flistxattrfs/xattr.c
197removexattrsys_removexattrfs/xattr.c
198lremovexattrsys_lremovexattrfs/xattr.c
199fremovexattrsys_fremovexattrfs/xattr.c
200tkillsys_tkillkernel/signal.c
201timesys_timekernel/time.c
202futexsys_futexkernel/futex.c
203sched_setaffinitysys_sched_setaffinitykernel/sched/core.c
204sched_getaffinitysys_sched_getaffinitykernel/sched/core.c
205set_thread_areaarch/x86/kernel/tls.c
206io_setupsys_io_setupfs/aio.c
207io_destroysys_io_destroyfs/aio.c
208io_geteventssys_io_geteventsfs/aio.c
209io_submitsys_io_submitfs/aio.c
210io_cancelsys_io_cancelfs/aio.c
211get_thread_areaarch/x86/kernel/tls.c
212lookup_dcookiesys_lookup_dcookiefs/dcookies.c
213epoll_createsys_epoll_createfs/eventpoll.c
214epoll_ctl_oldNOT IMPLEMENTED
215epoll_wait_oldNOT IMPLEMENTED
216remap_file_pagessys_remap_file_pagesmm/fremap.c
217getdents64sys_getdents64fs/readdir.c
218set_tid_addresssys_set_tid_addresskernel/fork.c
219restart_syscallsys_restart_syscallkernel/signal.c
220semtimedopsys_semtimedopipc/sem.c
221fadvise64sys_fadvise64mm/fadvise.c
222timer_createsys_timer_createkernel/posix-timers.c
223timer_settimesys_timer_settimekernel/posix-timers.c
224timer_gettimesys_timer_gettimekernel/posix-timers.c
225timer_getoverrunsys_timer_getoverrunkernel/posix-timers.c
226timer_deletesys_timer_deletekernel/posix-timers.c
227clock_settimesys_clock_settimekernel/posix-timers.c
228clock_gettimesys_clock_gettimekernel/posix-timers.c
229clock_getressys_clock_getreskernel/posix-timers.c
230clock_nanosleepsys_clock_nanosleepkernel/posix-timers.c
231exit_groupsys_exit_groupkernel/exit.c
232epoll_waitsys_epoll_waitfs/eventpoll.c
233epoll_ctlsys_epoll_ctlfs/eventpoll.c
234tgkillsys_tgkillkernel/signal.c
235utimessys_utimesfs/utimes.c
236vserverNOT IMPLEMENTED
237mbindsys_mbindmm/mempolicy.c
238set_mempolicysys_set_mempolicymm/mempolicy.c
239get_mempolicysys_get_mempolicymm/mempolicy.c
240mq_opensys_mq_openipc/mqueue.c
241mq_unlinksys_mq_unlinkipc/mqueue.c
242mq_timedsendsys_mq_timedsendipc/mqueue.c
243mq_timedreceivesys_mq_timedreceiveipc/mqueue.c
244mq_notifysys_mq_notifyipc/mqueue.c
245mq_getsetattrsys_mq_getsetattripc/mqueue.c
246kexec_loadsys_kexec_loadkernel/kexec.c
247waitidsys_waitidkernel/exit.c
248add_keysys_add_keysecurity/keys/keyctl.c
249request_keysys_request_keysecurity/keys/keyctl.c
250keyctlsys_keyctlsecurity/keys/keyctl.c
251ioprio_setsys_ioprio_setfs/ioprio.c
252ioprio_getsys_ioprio_getfs/ioprio.c
253inotify_initsys_inotify_initfs/notify/inotify/inotify_user.c
254inotify_add_watchsys_inotify_add_watchfs/notify/inotify/inotify_user.c
255inotify_rm_watchsys_inotify_rm_watchfs/notify/inotify/inotify_user.c
256migrate_pagessys_migrate_pagesmm/mempolicy.c
257openatsys_openatfs/open.c
258mkdiratsys_mkdiratfs/namei.c
259mknodatsys_mknodatfs/namei.c
260fchownatsys_fchownatfs/open.c
261futimesatsys_futimesatfs/utimes.c
262newfstatatsys_newfstatatfs/stat.c
263unlinkatsys_unlinkatfs/namei.c
264renameatsys_renameatfs/namei.c
265linkatsys_linkatfs/namei.c
266symlinkatsys_symlinkatfs/namei.c
267readlinkatsys_readlinkatfs/stat.c
268fchmodatsys_fchmodatfs/open.c
269faccessatsys_faccessatfs/open.c
270pselect6sys_pselect6fs/select.c
271ppollsys_ppollfs/select.c
272unsharesys_unsharekernel/fork.c
273set_robust_listsys_set_robust_listkernel/futex.c
274get_robust_listsys_get_robust_listkernel/futex.c
275splicesys_splicefs/splice.c
276teesys_teefs/splice.c
277sync_file_rangesys_sync_file_rangefs/sync.c
278vmsplicesys_vmsplicefs/splice.c
279move_pagessys_move_pagesmm/migrate.c
280utimensatsys_utimensatfs/utimes.c
281epoll_pwaitsys_epoll_pwaitfs/eventpoll.c
282signalfdsys_signalfdfs/signalfd.c
283timerfd_createsys_timerfd_createfs/timerfd.c
284eventfdsys_eventfdfs/eventfd.c
285fallocatesys_fallocatefs/open.c
286timerfd_settimesys_timerfd_settimefs/timerfd.c
287timerfd_gettimesys_timerfd_gettimefs/timerfd.c
288accept4sys_accept4net/socket.c
289signalfd4sys_signalfd4fs/signalfd.c
290eventfd2sys_eventfd2fs/eventfd.c
291epoll_create1sys_epoll_create1fs/eventpoll.c
292dup3sys_dup3fs/file.c
293pipe2sys_pipe2fs/pipe.c
294inotify_init1sys_inotify_init1fs/notify/inotify/inotify_user.c
295preadvsys_preadvfs/read_write.c
296pwritevsys_pwritevfs/read_write.c
297rt_tgsigqueueinfosys_rt_tgsigqueueinfokernel/signal.c
298perf_event_opensys_perf_event_openkernel/events/core.c
299recvmmsgsys_recvmmsgnet/socket.c
300fanotify_initsys_fanotify_initfs/notify/fanotify/fanotify_user.c
301fanotify_marksys_fanotify_markfs/notify/fanotify/fanotify_user.c
302prlimit64sys_prlimit64kernel/sys.c
303name_to_handle_atsys_name_to_handle_atfs/fhandle.c
304open_by_handle_atsys_open_by_handle_atfs/fhandle.c
305clock_adjtimesys_clock_adjtimekernel/posix-timers.c
306syncfssys_syncfsfs/sync.c
307sendmmsgsys_sendmmsgnet/socket.c
308setnssys_setnskernel/nsproxy.c
309getcpusys_getcpukernel/sys.c
310process_vm_readvsys_process_vm_readvmm/process_vm_access.c
311process_vm_writevsys_process_vm_writevmm/process_vm_access.c
312kcmpsys_kcmpkernel/kcmp.c
313finit_modulesys_finit_modulekernel/module.c

注:系统调用号与unistd.h中定义并不一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值