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;
}
}