系统调用:解释ktrace输出

时间:2016-07-26 13:46:20

标签: c unix system-calls ln

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

用户试图执行的UNIX命令是哪一个?在标有*的行中发生了什么?出了什么问题?

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

的操作

ln -s dir ls

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

用户尝试执行的命令是 ln ls dir ,它基本上使用单词dir作为ls命令的“别名”。

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

通过使用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)还是作为符号链接(lstat)。

因为不是这种情况,所以该过程会尝试链接原始示例中的文件(linkat - :link)。如前所述,由于权限,这会出错。

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