fstat、stat和lstat 区别

http://hi.baidu.com/wlwqs/item/47c411334e53a5ffdf222150

 

int fstat(int filedes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

一眼就能看出来fstat的第一个参数是和另外两个不一样的,fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“

文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(这样记,lstat比stat多了一个l,因此它是

有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指

文件喽) 

  1. /* 
  2.  * Linux文件属性结构体信息 
  3.  * struct stat 
  4.  * { 
  5.  *  dev_t st_dev;//设备 
  6.  *  ino_t st_ino;//结点 
  7.  *  mode_t st_mode;//模式 
  8.  *  nlink_t st_nlink;//硬连接 
  9.  *  uid_t st_uid;//用户ID 
  10.  *  gid_t st_gid;//组ID 
  11.  *  dev_t st_rdev;//设备类型 
  12.  *  off_t st_off;//文件字节数 
  13.  *  unsigned long st_blksize;//块大小 
  14.  *  unsigned long st_blocks;//块数 
  15.  *  time_t st_atime;//最后一次访问时间 
  16.  *  time_t st_mtime;//最后一次修改时间 
  17.  *  time_t st_ctime;//最后一次属性改变时间 
  18.  * } 
  19.  * 可通过stat或fstat函数获得文件的其他属性 
  20.  * stat函数用来判断没有打开的文件,而fstat函数用来判断打开的文件。 
  21.  * 
  22.  */ 
  23. #include <unistd.h>  
  24. #include <sys/stat.h>   
  25. int main(void)  
  26. {  
  27.     struct stat buf;  
  28.     stat("/etc/passwd",&buf);  
  29.     /* 
  30.      * stat函数 
  31.      * 取得文件的属性 
  32.      * sys/stat.h,unistd.h 
  33.      * int stat(const char *file_name,struct stat*buf); 
  34.      * 将参数file_name所指的文件状态复制到参数buf所指的结构中 
  35.      * 成功返回0,失败返回-1,错误存储于errno 
  36.      */  
  37.     printf("/etc/passwd文件的大小是:%d/n",buf.st_size);  
  38.     printf("/etc/passwd文件的最后一次修改时间是:%d/n",buf.st_ctim);  
  39.     return 0;  
  40. }  
原文地址:https://www.cnblogs.com/nufangrensheng/p/2952617.html