我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是. 我添加了代码来打印出每个文件
我添加了代码来打印出每个文件的检索主要和次要数字,并且打印出与我执行ls -l / dev / tty和ls -l / dev / tty2时得到的数字不同的数字.打印出tty和tty2的主要和次要数字是0和6,而使用ls时,tty为5和0,tty2为4和2.
我是Linux和C的新手.
我已经仔细检查了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; }根据手册页,st_dev是包含文件的设备的ID.换句话说,文件名所在的设备.因此它与/ dev目录相同,因为您将看到是否使用shell中的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; } }