加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:22:46 所属栏目:百科 来源:网络整理
导读:我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是. 我添加了代码来打印出每个文件的检索主要和次要数字,并且打印出与我执行ls -l / dev / tty和ls -l / dev /
我的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  %dn%d  %dn",major1,major2,minor1,minor2);

            if (major1 == major2 && minor1 == minor2) {
                    printf("the two device files are equaln");
                    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 devicen",name);
        return 1;
    }
    *dev_major = major(buf.st_rdev);
    *dev_minor = minor(buf.st_rdev);
    return 0;
}

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读