【问题标题】:System Calls: Interpreting ktrace output系统调用:解释 ktrace 输出
【发布时间】:2016-07-26 13:46:19
【问题描述】:

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

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

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

ln -s 目录 ls

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

【问题讨论】:

    标签: c unix system-calls ln


    【解决方案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)。如前所述,这会因为权限而出错。

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

    【讨论】:

    • 链接不是别名。它可能在 Windows 中,但不在 Unixoids 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多