【发布时间】:2016-07-26 13:46:19
【问题描述】:
在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想要执行类似的操作
ln -s 目录 ls
但这并没有给我预期的输出。
【问题讨论】:
标签: c unix system-calls ln
在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想要执行类似的操作
ln -s 目录 ls
但这并没有给我预期的输出。
【问题讨论】:
标签: c unix system-calls ln
所以我设法自己回答了这个问题。
用户尝试执行的命令是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)。如前所述,这会因为权限而出错。
该过程最终以否定退出代码结束。
【讨论】: