0

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

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

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

ln -s 目录

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

在此处输入图像描述

4

1 回答 1

1

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

用户尝试执行的命令是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)

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

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

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

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

于 2016-07-26T18:14:44.277 回答