文件和目录
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;
}
stat函数和文件类型
最新推荐文章于 2024-02-12 22:55:08 发布