非设备文件上的major(stat.st_rdev)和minor(stat.st_rdev)

时间:2015-07-31 00:55:44

标签: c linux stat

简单的问题:在Linux中,我stat()一个不是设备的文件。 st_rdev字段的期望值是多少?我可以运行major(stat.st_rdev)minor(stat.st_rdev)吗?如果是,那么预期的回报值是多少?

代码示例:

struct stat sstat = stat("myfileordevice");
ProcessFileOrDevice("myfileordevice",
                    sstat.st_mode,
                    major(stat.st_rdev),
                    minor(stat.st_rdev));

1 个答案:

答案 0 :(得分:3)

  

如果我stat.st_rdev非设备文件系统条目,stat()应该有什么价值?

这取决于条目所在的文件系统。 Linux中的内部结构和函数(例如fs/stat.c)允许每个文件系统定义值。

通常,该值应为零。快速测试(stat -c '%t:%T' some-files-and-directories)表明它往往是。我只是找不到任何保证或声称它应该零。

  

使用major(stat.st_rdev)和次要(stat.st_rdev)

是否安全

当然;它们只对指定的值应用一些算术,并返回结果。

就个人而言,我倾向于使用像

这样的东西
    unsigned int maj, min;
    struct stat  info;

    /* stat(), fstat(), fstatat() or something
       to fill the info buffer */

    if (S_ISCHR(info.st_mode) || S_ISBLK(info.st_mode)) {
        maj = major(info.st_rdev);
        min = minor(info.sr_rdev);
    } else {
        maj = 0U;
        min = 0U;
    }

    ProcessFileOrDevice("myfileordevice", info.st_mode, maj, min);

只是为了确保。请注意,ProcessFileOrDevice()函数也可以自行检查,并忽略majmin值,除非S_ISCHR(info.st_mode)S_ISBLK(info.st_mode)值为真。

man 2 stat手册页包含更多有用的详细信息。