系统调用:解释 ktrace 输出
System Calls: Interpreting ktrace output
在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想执行类似
的操作
ln -s dir ls
但这并没有给我预期的输出。
所以我设法自己回答了这个问题。
用户尝试执行的命令是ln ls dir
,它主要针对使用单词dir 作为ls 命令的'alias'。
这是错误的,因为用户试图在一个没有向他授予写权限的目录中操作(很可能是 /bin
目录),这意味着他无法创建一个此目录中的文件(hardlink)。
通过使用 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
) 或作为符号 link (lstat
)。
因为情况并非如此,进程会尝试 link 文件(linkat
- 在原始示例中:link
)。如前所述,由于权限问题,这会出错。
进程最终以负退出代码结束。
在为即将到来的考试学习时,我遇到了以下问题:
用户尝试执行的 UNIX 命令是什么?标有 * 的行中发生了什么?出了什么问题?
我发现用户可能想执行类似
的操作ln -s dir ls
但这并没有给我预期的输出。
所以我设法自己回答了这个问题。
用户尝试执行的命令是ln ls dir
,它主要针对使用单词dir 作为ls 命令的'alias'。
这是错误的,因为用户试图在一个没有向他授予写权限的目录中操作(很可能是 /bin
目录),这意味着他无法创建一个此目录中的文件(hardlink)。
通过使用 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
) 或作为符号 link (lstat
)。
因为情况并非如此,进程会尝试 link 文件(linkat
- 在原始示例中:link
)。如前所述,由于权限问题,这会出错。
进程最终以负退出代码结束。