您的位置:首页 > 编程语言 > C语言/C++

stat函数和文件类型

2013-12-31 21:42 489 查看
文件和目录
stat  ,fstat , lstat
#include <sys/stat.h>

stat 函数
int stat (const char * restirct pathname ,struct stat * restrict buf)

int fstat(int filedes , struct stat * buf)

int lstat(const char *restrict pathname, struct stat * restrict buf)
此三个函数的返回值,如果成功返回0 ,失败返回 -1
star函数fan'hui返回给定文件的相关信息.fstat 函数获取已经在描述符filedes 上面打开的文件的相关信息,lstat与stat类似,但是当文件名是一个符号链接是,lstat 返回该符号链接的有关信息,而不是有该链接符号引用文件的信息.
第二个参数buf指向一个结构,这些stat函数填写由buf指向的结构.该结构的实际实现可能有所不同,但基本形式是:
struct stat{
mode_t	st_mode ;
ino_t st	ino;
dev_t 	st_dev;
dev_t	st_rdev;
nlink_t	st_nlink;
uid_t		st_uid;
gid_t		st_gid;
off_t		st_size;
time_t	st_atime;
time_t	st_mtime;
time_t 	st_ctime;
bllsize_t	st_blksize;
blkcnt_t	st_blocks;
};
stat 结构提供的文件信息可以通过 ls -l 查看

文件的类型:
(1)普通文件(regular file):最常见的文件类型,包含了某种形式的数据
(2)目录文件(directory file):这种文件包含了其他文件的名字和指向与这些文件相关的信息.
(3)特殊块文件(block special file) :这种文件类型提供对设备(如磁盘)带缓冲的访问,每次访问以固定的长度为单位.
(4)字符特殊文件(character special file): 这种文件提供对设备不带缓冲的访问,每次访问的长度可变,系统中所有的设备要么是特殊字符文件,要么是块特殊文件.
(5)FIFO: 这中类型文件用于进程间通信,有时称其为命名管道(named pipe)
(6)套接字(pocket) :用于进程间的网络通信,也可用于在一台宿主机上的进程之间的非网络通信.
(7)符号链接(symboliek link): 这中文件类型指向另一个文件
文件类型的信息包含在stat结构的st_mode成员中.
<sys/stat.h>中的文件类型宏
S_ISREG()	===>普通文件
S_ISDIR()		===>目录文件
S_ISCHR()	===>字符特殊文件
S_ISBLK()	===>块特殊文件
S_ISFIFO()	===>管道或FIFO
S_ISLINK() 	===>符号链接
S_ISSOCK()	===>套接字

一个打印文件类型的程序:
#include "apue.h"

int main(int argc , char * argv[])
{
int  i;
struct stat buf;
char *ptr;

for ( i = 1 ; i <argc ; i++ ){

printf("%s:",argv[i]);
if(lstat(argv[i],&buf) < 0)
{
printf("lstat error");
continue ;
}
if (S_ISREG(buf.st_mode))
ptr = "regular file";
else if(S_ISDIR(buf.st_mode))
ptr = "direecroty file";

else if(S_ISBLK(buf.st_mode))
ptr = "block file";
else if(S_ISFIFO(buf.st_mode))
ptr = "FIFO file";
else if(S_ISLNK(buf.st_mode))
ptr = "symbolic file";
else if(S_ISSOCK(buf.st_mode))
ptr = "socket file";
else if(S_ISCHR(buf.st_mode))
ptr = "character file";
else
ptr = "unknown mode";
printf ("%s\n",ptr);
}

return 0;
}


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