有现成的函数直接调!其根据有鲁棒性!起始写代码的大部分工作就是在给一个算法增加鲁棒性!
反思
1. 源码中调用的是get_root_dev_info
struct dev_ino dev_ino_buf;
struct dev_ino *root_dev_ino = get_root_dev_ino (&dev_ino_buf);
个人认为,有现成的函数调用还是用现成的,但是pwd的源码调用的库都在coreutils/lib中,我调不了,所以就使用了下面的方式。
2. get_root_dev_info中使用的是lstat系统调用获取的根目录dev_info。
lstat与stat的区别在于若文件是软链接,依然获取的就是软链接文件信息。为什么要用lstat,而不是stat呢?为什么我会觉得应该使用stat呢?因为我觉得如果"/",是个软链接的话,应该使用stat获取源文件信息。但是"/"不可能为软链接的!!!
,所以用stat和lstat没啥区别了。用那个都是一样的。
推测:使用lstat是一种习惯或者lstat有一些更好的鲁棒性
2. 为什么要确保文件名开始是’/'呢?(这个情况很难考虑到,让我来写,一开始肯定考虑不到。)
这种情况是在根目录下输入pwd
的情形,此时p->start
指向的位置刚好为空。
代码
static void
robust_getcwd (struct file_name* file_name)
{
size_t height = 1;
struct stat root_sb;
struct stat dot_sb;
if (stat ("/", &root_sb))
exit(1);
if (stat (".", &dot_sb))
exit(1);
while (1)
{
/* Break down when reach the root. */
if (SAME_INODE (root_sb, dot_sb))
break;
find_dir_entry (&dot_sb, file_name, height++);
}
/* Ensure file_name first character is slash. */
/* Cound happen this condition? */
if (file_name->start[0] == '\0')
file_name_prepend (file_name, "", 0);
}