c – major()和minor()给出与ls不同的数字
发布时间:2020-12-16 09:22:46 所属栏目:百科 来源:网络整理
导读:我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是. 我添加了代码来打印出每个文件的检索主要和次要数字,并且打印出与我执行ls -l / dev / tty和ls -l / dev /
我的C程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要数字).它输出tty和tty2是相同的设备文件,而我认为它们不是.
我添加了代码来打印出每个文件的检索主要和次要数字,并且打印出与我执行ls -l / dev / tty和ls -l / dev / tty2时得到的数字不同的数字.打印出tty和tty2的主要和次要数字是0和6,而使用ls时,tty为5和0,tty2为4和2. 我是Linux和C的新手. #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 %dn%d %dn",major1,major2,minor1,minor2); if (major1 == major2 && minor1 == minor2) { printf("the two device files are equaln"); 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 devicen",name); return 1; } *dev_major = major(buf.st_rdev); *dev_minor = minor(buf.st_rdev); return 0; } int main(void) { unsigned int major1,minor2; if (get_char_device("/dev/tty1",&major1,&minor1) || get_char_device("/dev/tty2",&major2,&minor2)) { return 1; } printf("%d %dn%d %dn",minor2); if (major1 == major2 && minor1 == minor2) { puts("the two device files are equal"); return 1; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |