major()和minor()给出与ls不同的数字

时间:2019-01-31 16:44:17

标签: c linux

我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件以及相同的主要和次要编号)。结果显示ttytty2是相同的设备文件,而我认为它们不是。

我添加了代码,以打印出每个文件检索到的主要和次要数字,并且它打印出的数字与我进行ls -l /dev/ttyls -l /dev/tty2时得到的数字不同。 ttytty2的主要和次要数字分别是0和6,而使用ls时,tty分别是5和0,{分别是4和2 {1}}。

我是Linux和C的新手。 我已经仔细检查了tty2major()的联机帮助页,看来我正确地使用了这些功能。所以,我不知道出了什么问题。

minor()

1 个答案:

答案 0 :(得分:6)

根据手册页,

st_dev是包含文件的设备的 ID 。换句话说,文件的 name 所在的设备。因此,它与您的/dev目录相同,因为您将在外壳中使用stat命令。

您对 st_rdev 感兴趣,这是设备ID(如果是特殊文件)(同样,在手册页中)。

stat命令同时显示:

stat /dev/tty /dev/tty1

  File: /dev/tty
  Size: 0               Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 1035        Links: 1     Device type: 5,0
Access: (0620/crw--w----)  Uid: (    0/    root)   Gid: (    5/     tty)

....

  File: /dev/tty1
  Size: 0               Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 1044        Links: 1     Device type: 4,1
Access: (0620/crw--w----)  Uid: (    0/    root)   Gid: (    5/     tty)

固定代码

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <unistd.h>

int get_char_device(const char *name,
                    unsigned *dev_major, unsigned *dev_minor)
{
    struct stat buf;
    if (stat(name, &buf)) {
        perror(name);
        return 1;
    }
    if (!S_ISCHR(buf.st_mode)) {
        fprintf(stderr, "%s: not a char device\n", name);
        return 1;
    }
    *dev_major = major(buf.st_rdev);
    *dev_minor = minor(buf.st_rdev);
    return 0;
}

int main(void)
{
    unsigned int major1, minor1, major2, minor2;
    if (get_char_device("/dev/tty1", &major1, &minor1) ||
        get_char_device("/dev/tty2", &major2, &minor2)) {
        return 1;
    }

    printf("%d  %d\n%d  %d\n", major1, major2, minor1, minor2);
    if (major1 == major2 && minor1 == minor2) {
        puts("the two device files are equal");
        return 1;
    }
}