Какое значение должно иметь 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
st_rdev
будет там, независимо от того, является ли оно устройством или нет... и макросыmajor()
иminor()
, вероятно, все еще будут работать... но значения будут мусором для не-устройств, поэтому вы не сможете использовать результаты. - person Dmitri   schedule 31.07.2015