系统调用:解释 ktrace 输出

System Calls: Interpreting ktrace output

在为即将到来的考试学习时,我遇到了以下问题:

用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?

我发现用户可能想执行类似

的操作

ln -s dir ls

但这并没有给我预期的输出。

所以我设法自己回答了这个问题。

用户尝试执行的命令是ln ls dir,它主要针对使用单词dir 作为ls 命令的'alias'。

这是错误的,因为用户试图在一个没有向他授予写权限的目录中操作(很可能是 /bin 目录),这意味着他无法创建一个此目录中的文件(hardlink)。

通过使用 ktrace/kdump 我设法重现了输出:

  [...]
 *77019 ln       CALL  stat(0x7fffffffebab,0x7fffffffd668)
  77019 ln       NAMI  "test/ls"
  77019 ln       RET   stat 0
 *77019 ln       CALL  lstat(0x7fffffffebb3,0x7fffffffd668)
  77019 ln       NAMI  "test/dir"
  77019 ln       RET   lstat -1 errno 2 No such file or directory
 *77019 ln       CALL  stat(0x7fffffffebb3,0x7fffffffd668)
  77019 ln       NAMI  "test/dir"
  77019 ln       RET   stat -1 errno 2 No such file or directory
 *77019 ln       CALL  lstat(0x7fffffffebb3,0x7fffffffd668)
  77019 ln       NAMI  "test/dir"
  77019 ln       RET   lstat -1 errno 2 No such file or directory
 *77019 ln       CALL linkat(AT_FDCWD,0x7fffffffebab,AT_FDCWD,0x7fffffffebb3,0x400)
  77019 ln       NAMI  "test/ls"
  77019 ln       NAMI  "test/dir"
  77019 ln       RET   linkat -1 errno 13 Permission denied
  [...]
 *77019 ln       CALL  exit(0x1)

标有星号的步骤可以解释如下:

第一个系统调用是收集原始文件的 inode 信息 (´test/ln)。 接下来,它检查目标文件 (test/dir) 是否已经存在,作为命名文件 (stat) 或作为符号 link (lstat)。

因为情况并非如此,进程会尝试 link 文件(linkat- 在原始示例中:link)。如前所述,由于权限问题,这会出错。

进程最终以负退出代码结束。