我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件以及相同的主要和次要编号)。结果显示tty
和tty2
是相同的设备文件,而我认为它们不是。
我添加了代码,以打印出每个文件检索到的主要和次要数字,并且它打印出的数字与我进行ls -l /dev/tty
和ls -l /dev/tty2
时得到的数字不同。 tty
和tty2
的主要和次要数字分别是0和6,而使用ls
时,tty
分别是5和0,{分别是4和2 {1}}。
我是Linux和C的新手。
我已经仔细检查了tty2
和major()
的联机帮助页,看来我正确地使用了这些功能。所以,我不知道出了什么问题。
minor()
答案 0 :(得分:6)
st_dev
是包含文件的设备的 ID 。换句话说,文件的 name 所在的设备。因此,它与您的/dev
目录相同,因为您将在外壳中使用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 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;
}
}