全部博文(71)
分类: LINUX
2008-04-15 20:48:33
六、文件的属性
11
名称: |
stat/fstat/lstat |
目标: |
得到文件的属性。 |
头文件: |
#include #include #include |
函数原形: |
int stat(const char *file_name,struct stat *buf) int fstat(int filedes, struct stat *buf) int lstat(const char *file_name,struct stat *buf) |
参数: |
file_name 文件名 filedes 文件描述符 buf 指向buffer的指针 |
返回值: |
-1 遇到错误 |
|
0 成功返回 |
Stat把文件fname 的信息复制到指针bufp所指的结构中。Stat包括的信息有
st_mode 文件类型和许可权限
st_uid 用户所有者ID
st_gid 所属组ID
st_size 所占字节数
st_nlink 文件链接数
st_mtime 文件最后修改时间
st_atime 文件最后访问时间
st_actime 文件属性最后改变时间
下面的程序得到这些属性,并显示它们。
/*2_7.c*/ #include #include #include int main(int ac, char *av[ ]) { struct stat info; if(ac>1) if(stat(av[1],&info)!=-1) { show_stat_info(av[1],&info); return 0; } else perror(av[1]); return 1; } show stat_info(char *fname,struct stat *buf) { printf(“mode : %o\n”,buf->st_mode); /*显示文件模式字段*/ printf(“links : %d\n”,buf->st_nlink); /*显示链接数*/ printf(“user : %d\n”,buf->st_uid); /*显示用户名ID*/ printf(“group : %d\n”,buf->st_gid); /*显示组ID*/ printf(“size : %d\n”,buf->st_size); /*显示文件大小*/ printf(“modtime : %d\n”,buf->st_mtime); /*显示文件的最后修改时间*/ printf(“name:%s\n”,fname); /*显示文件名*/ } |
fstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。
编译并运行fileinfo.c:
[root@LINUX root]#cc –o fileinfo fileinfo.c [root@LINUX root]#./fileinfo fileinfo.c mode:100664 links: 1 user:500 group:120 size:1106 modtime:965158604 name:fileinfo.c |
这个程序就是ls –l 命令实现代码的一部分,但是会和ls –l的输出有些不同,比如说时间的表示,用户和组ID的表示,文件权限的表示。涉及到了Linux编码的问题,这里不作介绍,大家可以查阅相关质料。
七、文件的存取性和权限
12.
名称: |
access |
目标: |
确定文件的可存取性 |
头文件: |
#include < unistd.h> |
函数原形: |
int access(const char *pathname ,int mode); |
参数: |
pathname 文件名 mode 新的所有权和特殊属性。 |
返回值: |
-1 遇到错误 |
|
0 成功返回 |
其中,mode是表4-5中所列常数的逐位或运算。
access函数的mode常数有:
R_OK 测试读许可权
W_OK 测试写许可权
X_OK 测试执行许可权
F_OK 测试文件是否存在
当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其存取许可权测试。有时,进程也希望按区实际用户ID和实际组ID来测试其存取能力。例如当一个进程使用设置用户ID,或设置组ID特征作为另一个用户(或组)运行时,就可能需要。
access函数是按实际用户ID和实际组ID进行存取许可权测试的。下面是程序例子。
/*2_8.c*/ #include #include #include #include int main(int argc,char *argv[]) { if(access(argv[1],R_OK)<0) printf(“access error for %s\n”,argv[1]; else printf(“read access OK\n”); if(open(argv[1],O_RDONLY)<0) printf(“open for reading OK\n”); else printf(“open for reading OK\n”); } |