major(stat.st_rdev) и minor(stat.st_rdev) для файлов, не относящихся к устройству

Простые вопросы: в Linux я stat() файл, который не является устройством. каково ожидаемое значение поля st_rdev? Могу ли я запустить major(stat.st_rdev) и minor(stat.st_rdev)? Если да, то каковы ожидаемые возвращаемые значения?

Пример кода:

struct stat sstat = stat("myfileordevice");
ProcessFileOrDevice("myfileordevice",
                    sstat.st_mode,
                    major(stat.st_rdev),
                    minor(stat.st_rdev));

person Aaron Campbell    schedule 31.07.2015    source источник
comment
Поле st_rdev будет там, независимо от того, является ли оно устройством или нет... и макросы major() и minor(), вероятно, все еще будут работать... но значения будут мусором для не-устройств, поэтому вы не сможете использовать результаты.   -  person Dmitri    schedule 31.07.2015


Ответы (1)


Какое значение должно иметь stat.st_rdev, если я stat() не являюсь записью файловой системы устройства?

Это зависит от файловой системы, в которой находится запись. Внутренние структуры и функции в Linux (такие какfs/stat.c) позволяют каждой файловой системе определять значения.

В общем случае значение должно быть равно нулю. Быстрое тестирование (stat -c '%t:%T' some-files-and-directories) показывает, что это так. Я просто не могу найти никаких гарантий или утверждений, что оно должно быть равно нулю.

Безопасно ли использовать major(stat.st_rdev) и второстепенные (stat.st_rdev)

Конечно; они только применяют некоторые арифметические действия к указанному значению и возвращают результат.

Лично я был бы склонен использовать что-то вроде

    unsigned int maj, min;
    struct stat  info;

    /* stat(), fstat(), fstatat() or something
       to fill the info buffer */

    if (S_ISCHR(info.st_mode) || S_ISBLK(info.st_mode)) {
        maj = major(info.st_rdev);
        min = minor(info.sr_rdev);
    } else {
        maj = 0U;
        min = 0U;
    }

    ProcessFileOrDevice("myfileordevice", info.st_mode, maj, min);

просто чтобы убедиться. Обратите внимание, что функция ProcessFileOrDevice() может также сама выполнять проверку и игнорировать значения maj и min, если только значения S_ISCHR(info.st_mode) или S_ISBLK(info.st_mode) не являются истинными.

man 2 stat справочная страница содержит дополнительную полезную информацию.

person Nominal Animal    schedule 31.07.2015