文件类型
1、普通文件:除了可执行文件,其他的文件对操作系统来说都是无格式的。
2、目录文件:包含了其他文件的名字 和 指向这些文件的信息的指针的文件。
3、块特殊文件:这种文件提供了对设备(例如磁盘)的带缓冲的访问。每次访问以固定长度进行。
4、字符特殊文件:这种文件提供对设备的不带缓冲的访问,每次访问的长度可变。 系统中的所有设备要么是字符特殊文件 要么是 块特殊文件
5、FIFO : 这种文件用于进程间的通信,也可以称之为命名管道
6、套接字 : 这种文件类型用于网络通信 , 也可以用于本机上的进程通信( linux上编译的时候要定义 _GNU_SOURCE宏 )
7、符号链接:这种类型的文件指向另一个文件
用于判断文件类型的 宏 定义在<sys/stat.h>
S_ISREG(m) 普通文件?
S_ISDIR(m) 目录文件?
S_ISCHR(m) 字符设备?
S_ISBLK(m) 块设备?
S_ISFIFO(m) 命名管道?
S_ISLNK(m) 符号链接? (Not in POSIX.1-1996.)
S_ISSOCK(m) 套接字? (Not in POSIX.1-1996.)
这些宏的参数是struct stat 结构中的st_mode成员
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/stat.h> 4 5 int 6 main(int argc, char** argv) 7 { 8 struct stat buf; 9 int type; 10 char* p; 11 12 lstat(argv[1],&buf); //此处 用 lstat , 因为 stat 和 fstat 跟随链接 , 这样就不能测试 S_ISLNK(mode) 宏了 13 14 type = buf.st_mode; 15 if(S_ISREG(type)){ 16 p = "普通文件"; 17 }else if(S_ISDIR(type)){ 18 p = "目录文件"; 19 }else if(S_ISCHR(type)){ 20 p = "字符设备文件"; 21 }else if(S_ISBLK(type)){ 22 p = "块设备文件"; 23 }else if(S_ISFIFO(type)){ 24 p = "命名管道文件"; 25 }else if(S_ISLNK(type)){ 26 p = "链接文件"; // 特指软链接 27 }else if(S_ISSOCK(type)){ 28 p = "套接字文件"; 29 }else{ 30 p = "其他类型文件"; 31 } 32 printf("%s\n",p); 33 return 0; 34 }
cc -D__GNU_SOURCE file_type.c
这些宏的定义如下
#define S_ISXXX(type) ((type&S_IFMT) == S_IFXXX)
例如 :
#define S_ISDIR(type) ((type&S_IFMT) == S_IFDIR)