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 的第一个实现。资源释放原语—— ,等——应该是不可能失败的,它们的返回类型应该表明这一点。我完全打算一拿到时间机器就解决这个问题。]-1straceclosemunmapvoid