进程或程序正在进行的系统调用类型

type of syscall a process or program is making

我正在尝试找出一个进程或程序进行了多少种不同类型的系统调用。我知道我可以执行以下操作以获得每个系统调用的调用总数,如下所示。

strace -c cat abc.txt

上面的输出是命令。

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0        10           read
  -nan    0.000000           0         1           write
  -nan    0.000000           0        12           open
  -nan    0.000000           0        14           close
  -nan    0.000000           0        12           fstat
  -nan    0.000000           0        28           mmap
  -nan    0.000000           0        16           mprotect
  -nan    0.000000           0         3           munmap
  -nan    0.000000           0         3           brk
  -nan    0.000000           0         2           rt_sigaction
  -nan    0.000000           0         1           rt_sigprocmask
  -nan    0.000000           0         2           ioctl
  -nan    0.000000           0         1         1 access
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         1           fcntl
  -nan    0.000000           0         2           getdents
  -nan    0.000000           0         1           getrlimit
  -nan    0.000000           0         1           statfs
  -nan    0.000000           0         1           arch_prctl
  -nan    0.000000           0         2         1 futex
  -nan    0.000000           0         1           set_tid_address
  -nan    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   116         2 total

如您所见,它 returns 进行的系统调用总数为 116。我只需要知道进行了多少种不同类型的系统调用,在本例中为 22

有没有办法使用 strace 在一行中做到这一点?

将输出通过管道传输到 wc -l 以获取统计信息中的行数。由于统计信息写入标准错误,您需要为此做一些重定向。

strace -c cat abc.txt 2>&1 >/dev/null | wc -l

您还需要从中减去 4,因为有 header、总计和分隔线。