stat函数
stat既有命令也有同名函数,用来获取文件Inode里主要信息,stat 跟踪符号链接,lstat不跟踪符号链接
1. #include <sys/types.h> 2. 3. #include <sys/stat.h> 4. 5. #include <unistd.h> 6. 7. int stat(const char *path, struct stat *buf); 8. 9. int fstat(int fd, struct stat *buf); 10. 11. int lstat(const char *path, struct stat *buf); 12. 13. struct stat { 14. 15. dev_t st_dev; /* ID of device containing file */ 16. 17. ino_t st_ino; /* inode number */ 18. 19. mode_t st_mode; /* protection */ 20. 21. nlink_t st_nlink; /* number of hard links */ 22. 23. uid_t st_uid; /* user ID of owner */ 24. 25. gid_t st_gid; /* group ID of owner */ 26. 27. dev_t st_rdev; /* device ID (if special file) */ 28. 29. off_t st_size; /* total size, in bytes */ 30. 31. blksize_t st_blksize; /* blocksize for file system I/O */ 32. 33. blkcnt_t st_blocks; /* number of 512B blocks allocated */ 34. 35. time_t st_atime; /* time of last access */ 36. 37. time_t st_mtime; /* time of last modification */ 38. 39. time_t st_ctime; /* time of last status change */ 40. 41. };
stat里面时间辨析
atime(最近访问时间):
mtime(最近更改时间):指最近修改文件内容的时间
ctime(最近改动时间):指最近改动Inode的时间
一个stat应用的小例子,打印文件的inode、文件大小、文件系统I/O块大小
1. #include <stdio.h> 2. #include <string.h> 3. #include <sys/types.h> 4. #include <sys/stat.h> 5. #include <unistd.h> 6. #include <stdlib.h> 7. 8. #define NAME "1.txt" 9. 10. int main(void) 11. { 12. int ret = -1; 13. struct stat buf; 14. 15. memset(&buf, 0, sizeof(buf));//memset之后buf中全是零 16. 17. ret = stat(NAME, &buf); //stat后buf中有内容了 18. 19. if(ret < 0) 20. { 21. perror("stat"); 22. 23. exit(-1); 24. } 25. 26. //成功获取了stat结构体,从中可以得到各种属性信息 27. printf("inode = %d.\n",buf.st_ino); 28. printf("st_size = %d.\n",buf.st_size); 29. printf("st_blksize = %d.\n",buf.st_blksize); 30. 31. return 0; 32. }
执行结果:
access函数
1. #include <unistd.h> 2. 3. int access(const char *pathname, int mode);
按实际用户ID和实际组ID测试,跟踪符号链接,参数mode
R_OK 是否有读权限
W_OK 是否有写权限
X_OK 是否有执行权限
F_OK 测试一个文件是否存在
实际用户ID与有效用户ID的解释:
sudo执行时,有效用户ID是root,实际用户ID是当前用户
实际应用中,access用的最多的是F_OK参数,去判断一个文件是否存在
1. #include <stdio.h> 2. #include <unistd.h> 3. #include <string.h> 4. #include <error.h> 5. #include <errno.h> 6. #include <stdlib.h> 7. 8. int main(void) 9. { 10. if(access("abc", F_OK) < 0){ 11. perror("access"); 12. exit(1); 13. } 14. 15. printf("file abc is exist.\n"); 16. 17. return 0; 18. } 19.