十六、文件和目录——设备特殊文件
16.1 设备特殊文件介绍
- 每个文件系统所在的存储设备都由主、次设备号表示,文件系统为设备文件
- major 和 minor 这两个宏可用来获得主、次设备号。所有文件都由对应的主设备号和次设备号,可以通过 st_dev 加这两个宏获得
- 只有字符特殊文件和块特殊文件俺才有 st_rdev 值,其他的设备一般都是 st_dev ,这个两个值都在 stat 结构体中
8 为主设备号,1为次设备号
16.2 例子
1 #include <unistd.h> 2 #include <fcntl.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <sys/stat.h> 7 #include <memory.h> 8 9 10 void out_dev(unsigned long devno) 11 { 12 //生成主设备号和次设备号 13 int mj = major(devno); 14 int mi = minor(devno); 15 printf("(%5d, %5d)\n", mj, mi); 16 } 17 18 int main(int argc, char *argv[]) 19 { 20 if(argc < 2) { 21 fprintf(stderr, "usage: %s files\n", argv[0]); 22 exit(1); 23 } 24 25 struct stat buff; 26 int i; 27 for(i = 1; i < argc; i++) { 28 memset(&buff, 0, sizeof(buff)); 29 //获取文件属性信息 30 if(lstat(argv[i], &buff) < 0) { 31 perror("lstat error"); 32 continue; 33 } 34 printf("%-20s", argv[i]); 35 36 //判断是否是字符设备文件和块设备文件 37 if(S_ISCHR(buff.st_mode) || S_ISBLK(buff.st_mode)) { 38 //输出特殊设备文件具有的特殊设备号(包括主、次设备号) 39 //字符设备和块设备文件 40 out_dev(buff.st_rdev); 41 } 42 43 printf(" on:"); 44 45 //输出所有文件都具有的设备号(包括主次设备号) 46 out_dev(buff.st_dev); 47 } 48 49 return 0; 50 }