文件类型

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)

 

 

posted on 2013-05-30 12:12  wowk  阅读(311)  评论(0编辑  收藏  举报