文件类型包括如下几种:
- 普通文件。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于UNIX内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
- 目录文件。这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针。对于一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。进程必须使用本章介绍的函数才能更改目录。
- 块特殊文件。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度的单位进行。
- 字符特殊文件。这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
- FIFO。这种类型的文件用于进程见通信,有时也称为命名管道。
- 套接字。这种类型的文件用于进程间的网络通信。套接字也可用于一台宿主机上进程之间的非网络通信。
- 符号链接。这种类型的文件指向另一个文件。
文件类型信息包含在stat结构的st_mode成员中。
实例
取其命令参数,然后针对每一个命令行参数打印其文件类型。
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
struct stat buf;
char *ptr;
for (int i = 1; i < argc; ++i)
{
printf("%s : ", argv[i]);
if (lstat(argv[i], &buf) < 0)
{
printf("lstat error\n");
continue;
}
if (S_ISREG(buf.st_mode))
{
ptr = "regular";
}
else if (S_ISDIR(buf.st_mode))
{
ptr = "directory";
}
else if (S_ISCHR(buf.st_mode))
{
ptr = "character special";
}
else if (S_ISBLK(buf.st_mode))
{
ptr = "block special";
}
else if (S_ISFIFO(buf.st_mode))
{
ptr = "fifo";
}
else if (S_ISLNK(buf.st_mode))
{
ptr = "symbolic link";
}
else if (S_ISSOCK(buf.st_mode))
{
ptr = "socket";
}
else
{
ptr = "unkown mode";
}
printf("%s\n", ptr);
}
exit(0);
}
程序输出是:
./a.out /etc/passwd /etc /dev/log /dev/tty \
/var/lib/oprofile/opd_pipe /dev/sr0 /dev/cdrom
/etc/passwd : regular
/etc : directory
/dev/log : symbolic link
/dev/tty : character special
/var/lib/oprofile/opd_pipe : fifo // 这个可能未必存在,可能不同系统的fifo位置不同,本人是ubuntu kylin系统, 结果是lstat error
/dev/sr0 : block special
/dev/cdrom : symbolic link