当前位置 : 主页 > 编程语言 > c++ >

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

来源:互联网 收集:自由互联 发布时间:2021-06-23
我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是. 我添加了代码来打印出每个文件
我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是.

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

我是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;
}
根据手册页,st_dev是包含文件的设备的ID.换句话说,文件名所在的设备.因此它与/ dev目录相同,因为您将看到是否使用shell中的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;
    }
}
网友评论