您的位置:首页 > 其它

第四章:文件类型

2013-05-30 12:12 127 查看
文件类型

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成员

   

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>

int
main(int argc, char** argv)
{
struct  stat    buf;
int             type;
char*   p;

lstat(argv[1],&buf);  //此处 用 lstat  , 因为 stat 和 fstat 跟随链接 , 这样就不能测试  S_ISLNK(mode)  宏了

type = buf.st_mode;
if(S_ISREG(type)){
p = "普通文件";
}else if(S_ISDIR(type)){
p = "目录文件";
}else if(S_ISCHR(type)){
p = "字符设备文件";
}else if(S_ISBLK(type)){
p = "块设备文件";
}else if(S_ISFIFO(type)){
p = "命名管道文件";
}else if(S_ISLNK(type)){
p = "链接文件";  // 特指软链接
}else if(S_ISSOCK(type)){
p = "套接字文件";
}else{
p = "其他类型文件";
}
printf("%s\n",p);
return  0;
}


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)


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: