major () и minor () дают разные числа из ls - PullRequest
0 голосов
/ 31 января 2019

Часть моей программы на C состоит в выводе, равны ли два файла устройства (то есть, один и тот же тип файла устройства и одинаковые старшие и младшие числа).Он вывел, что tty и tty2 - это одни и те же файлы устройства, хотя я думаю, что это не так.

Я добавил код, чтобы распечатать восстановленные старшие и младшие номера для каждого файла, и он распечатал разные числа изчто я получил, когда сделал ls -l /dev/tty и ls -l /dev/tty2.Старшие и младшие числа, напечатанные для tty и tty2, равны 0 и 6, при использовании ls они равны 5 и 0 для tty и 4 и 2 для tty2.

Я новичок в Linux и C. Я дважды проверил man-страницу для 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;
}

1 Ответ

0 голосов
/ 31 января 2019

st_dev - это идентификатор устройства, содержащего файл , согласно справочной странице.Другими словами, устройство, на котором находится файл имя .То же самое относится и к вашей директории /dev, как вы увидите, если вы используете команду stat из вашей оболочки.

Вы заинтересованы в st_rdev, Идентификатор устройства (если это специальный файл) (опять же, со справочной страницы).

Команда stat показывает оба:

stat /dev/tty /dev/tty1

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

....

  File: /dev/tty1
  Size: 0               Blocks: 0          IO Block: 4096   character special file
Device: <b>6h/6d</b>   Inode: 1044        Links: 1     Device type: <b>4,1</b>
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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...