Linux系统应用编程---文件属性 stat和access

简介: Linux系统应用编程---文件属性 stat和access

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执行时,有效用户IDroot,实际用户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.
相关文章
|
5天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
22 5
|
2天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
12 3
|
2天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
12 3
|
5天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
16 6
|
2天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
12 2
|
5月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
125 1
|
6月前
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
113 0
Linux下的系统编程——线程同步(十三)
|
存储 Linux 调度
Linux系统编程 多线程基础
Linux系统编程 多线程基础
61 1
|
6月前
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
64 1
|
6月前
|
NoSQL Unix Linux
Linux下的系统编程——守护进程、线程(十二)
Linux下的系统编程——守护进程、线程(十二)
71 0
Linux下的系统编程——守护进程、线程(十二)