首页 > 解决方案 > major() 和 minor() 给出与 ls 不同的数字

问题描述

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

我添加了代码来打印每个文件的检索到的主要和次要编号,它打印出的数字与我执行时得到的数字不同,ls -l /dev/tty并且ls -l /dev/tty2. tty和打印出来的主要和次要数字tty2是 0 和 6,使用 时ls,它们分别是 5 和 0tty以及 4 和 2 tty2

我是 Linux 和 C 的新手。我仔细检查了手册页,major()似乎minor()我正确使用了这些功能。所以,我不知道出了什么问题。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>

#define report_error(x) puts("error") 

#define BUFFER_SIZE 1<<16    

int main(int argc, char *argv[])
{
    struct stat statbuf1;
    struct stat statbuf2;
    char *fn1;
    char *fn2;

    if (argc < 3) {
            if (argc < 1) {
                    report_error("no command line");
            } else {
                    report_error("Not enough arguments");
            }
    }

    fn1 = argv[1];
    fn2 = argv[2];

    if (lstat(fn1, &statbuf1)) {
            report_error(strerror(errno));
    }
    if (lstat(fn2, &statbuf2)) {
            report_error(strerror(errno));
    }

    if (S_ISCHR(statbuf1.st_mode) && S_ISCHR(statbuf2.st_mode)) {
            unsigned int major1 = major(statbuf1.st_dev);
            unsigned int major2 = major(statbuf2.st_dev);
            unsigned int minor1 = minor(statbuf1.st_dev);
            unsigned int minor2 = minor(statbuf2.st_dev);

            printf("%d  %d\n%d  %d\n", major1, major2, minor1, minor2);

            if (major1 == major2 && minor1 == minor2) {
                    printf("the two device files are equal\n");
                    exit(0);
            }
    }

    return 0;
}

标签: clinux

解决方案


st_dev根据手册页,是包含 file 的设备的ID。换句话说,文件所在的设备。所以它和你的/dev目录是一样的,你会看到你是否使用stat你的shell中的命令。

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

stat命令同时显示:

stat /dev/tty /dev/tty1

  文件:/dev/tty
  大小:0 块:0 IO 块:4096 个字符的特殊文件
设备:6h/6d    Inode:1035 链接:1 设备类型:5,0
访问:(0620/crw--w----) Uid:( 0/ root) Gid:( 5/ tty)

……

  文件:/dev/tty1
  大小:0 块:0 IO 块:4096 个字符的特殊文件
设备:6h/6d    Inode:1044 链接:1 设备类型:4,1
访问:(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;
    }
}

推荐阅读