现在的位置: 首页 > 综合 > 正文

UNIX环境高级编程读书笔记(二)—目录和文件 (3)

2014年09月21日 ⁄ 综合 ⁄ 共 2292字 ⁄ 字号 评论关闭

六、文件的属性

11

名称:

stat/fstat/lstat

目标:

得到文件的属性。

头文件:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

函数原形:

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 <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

 

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 <stdio.h>

#include <fcntl.h>

#include <sys/types.h>

#include <unistd.h>

 

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”);

 

}

 

 

抱歉!评论已关闭.