在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想要执行类似
ln -s 目录
但这并没有给我预期的输出。
在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想要执行类似
ln -s 目录
但这并没有给我预期的输出。
所以我设法自己回答了这个问题。
用户尝试执行的命令是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
。如前所述,由于权限,这会出错。
该过程最终以否定退出代码结束。