strace
从用户空间的角度生成系统调用的名称:so mmap
、open
、read
、write
等。这将不同于 libc 包装器执行比仅仅陷入操作系统更复杂的事情时编码的函数调用。例如,如果您sigaction
在代码中调用,strace
将显示对 的调用rt_sigaction
,因为多年来,rt_sigaction
它一直是设置信号操作的最通用系统调用,因此 GNU libc 实现了所有的信号设置函数原始。(在这种情况下,您不能rt_sigaction
直接调用,因为 glibc 没有为它公开包装器——我不知道为什么会这样。)
sys_mmap
是 Linux 内核中一个函数的名称,它恰好是mmap
系统调用的入口点。Linus 可以为系统调用入口点选择任何他想要的命名约定—— mmap
, mach_mmap
, ZwMmap
, 等等——这是一个实现细节,与用户空间无关。所以strace
不会给你看那些名字。
唯一返回类型为的系统调用是终止进程的系统调用void
,例如exit_group
. (从编程语言设计的角度来看,说它们没有返回类型会更准确,因为它们不返回。) strace
像这样打印:
exit_group(0) = ?
所有其他系统调用都会返回something,因为它们都可能(至少在理论上)失败,如果它们失败了,它们必须告诉您。如果除了成功/失败指示之外它们没有返回值,那么它们返回一个表示成功或失败int
为零的值,并逐字打印。[Soapbox:这是 Unix 中长期存在的设计错误,至少可以追溯到 NFS 的第一个实现。资源释放原语—— ,等——应该是不可能失败的,它们的返回类型应该表明这一点。我完全打算一拿到时间机器就解决这个问题。]-1
strace
close
munmap
void