【问题标题】:Implementing the ls command in C在 C 中实现 ls 命令
【发布时间】:2017-04-09 21:23:08
【问题描述】:

我正在尝试使用尽可能多的标志在 c 中实现 ls 命令,但是我在获取正确的 Minor 和 Major 文件时遇到了问题,这是我所做的一个示例。

> ls -l ~/../../dev/tty
crw-rw-rw- 1 root tty 5, 0 Nov 25 13:30 

这是正常的 ls 命令,你可以看到 Major 是 5,Minor 是 0。 我的程序显示以下内容:

Minor: 6
Major: 0

我还是一个初学者,所以我并没有真正理解这里的问题,这是我到目前为止所做的(该程序与 ls 命令不完全相同,但只显示有关文件的信息)。

int disp_file_info(char **argv)
{
 struct stat sb;

 stat(argv[1], &sb);
 printf("Inode: %d\n", sb.st_ino);
 printf("Hard Links: %d\n", sb.st_nlink);
 printf("Size: %d\n", sb.st_size);
 printf("Allocated space: %d\n", sb.st_blocks);
 printf("Minor: %d\n", minor(sb.st_dev));
 printf("Major: %d\n", major(sb.st_dev));
 printf("UID: %d\n", sb.st_uid);
 printf("GID: %d\n", sb.st_gid);
 }

目前这只是为了获取有关文件的某些信息,与 ls 命令相比,除了 Minor 和 Major 之外,一切似乎都是正确的。

【问题讨论】:

    标签: c linux ls


    【解决方案1】:

    您正在使用st_dev,这是文件所在的设备。你想要st_rdev,这是特殊文件“是”/代表的设备。 (不过,您应该首先检查该文件是否为设备节点。)

    【讨论】:

    • 我用 st_rdev 而不是 st_dev,效果很好,谢谢,你介意向我解释一下有什么区别吗?
    • 哦,没关系,这都在 man 2 stat 中,我跳过了 st_rdev 部分,抱歉,再次感谢 :)
    • @James 如果您查看man 2 stat,您可以看到st_dev 被描述为存储该文件的设备,而st_rdev 是该文件的“代表设备”文件……我真的不知道如何更好地解释它。 (编辑:好的,你自己找到的。=)
    • 是的,现在很干净^_^再次感谢,下次我不会跳过部分人的描述。
    猜你喜欢
    • 2016-07-25
    • 2012-11-13
    • 2022-11-13
    • 2012-06-09
    • 2014-05-30
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多