《Linux/Unix系统编程手册》读书笔记9(文件属性)

《Linux/Unix系统编程手册》读书笔记 目录

在Linux里,万物皆文件。所以文件系统在Linux系统占有重要的地位。本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来。

下图为磁盘分区与文件系统的关系

《Linux/Unix系统编程手册》读书笔记9(文件属性)

文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node)。i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据。

i-node与数据块的关系如下:

《Linux/Unix系统编程手册》读书笔记9(文件属性)

因为Linux支持很多类型的文件系统,但是每种文件系统的实现存在差异。为了解决这种差异,内核提供了虚拟文件系统,通过在应用程序与文件系统之间添加一个抽象层来让程序员在编写应用程序的时候不用考虑文件系统的种类。

《Linux/Unix系统编程手册》读书笔记9(文件属性)

初步了解文件系统后,进入正题-----文件属性

正因为万物皆文件,我们很多时候需要获取文件的信息,以便知道它是普通文件还是目录文件,或者想知道它的时间戳等信息。这时候我们可以通过stat()系统调用来获取我们想要的文件信息。

1 #include <sys/stat.h>

2 

3 int stat(const char *pathname, struct stat *statbuf);

4 int lstat(const char *pathname, struct stat *statbuf);

5 int fstat(int fd, struct stat *statbuf);

调用成功返回0,失败返回-1。文件的信息会存放到statbuf。

pathname为文件名,对于lstat,如果文件为符号链接的时候返回的为该链接的信息,而不是指向的文件。

fstat则是获取打开文件描述符对应的文件的信息。

 接着来看看stat结构的格式:

《Linux/Unix系统编程手册》读书笔记9(文件属性)

其中将st_mode与S_IFMT相与,可以得到文件类型,而st_mode的低12位为文件权限。除此之外还有时间戳需要注意,st_atime代表上次访问时间,st_mtime代表上次修改文件时间,st_ctime代表上次文件状态发生改变的时间。

我们经常会接触到文件的权限。其中用户分为3类:文件的所属者(owner),文件所属者所在的用户组,其他用户。每类的用户有3种权限:可读,可写,可执行。

 练习:

15-6:命令chmod a+rX file 的作用是对所有各类用户授予读权限,并且当file是目录或者file的任一类用户有可执行权限时,将向所有各类用户授予可执行权限。

 1 #include "tlpi_hdr.h"

 2 #include <unistd.h>

 3 #include <stdio.h>

 4 #include <sys/stat.h>

 5 #include <sys/types.h>

 6 

 7 #define READ (S_IRUSR | S_IRGRP | S_IROTH)

 8 #define EXECUTE (S_IXUSR | S_IXGRP | S_IXOTH)

 9 

10 

11 int main(int argc, char *argv[]){

12     struct stat sb;

13     int i;

14 

15     if(argc < 1 || strcmp(argv[1], "--help") == 0)

16         usageErr("%s filename...\n", argv[0]);

17 

18     for(i = 1; i < argc; i++){

19        if(stat(argv[i], &sb) == -1)

20            errExit("stat");

21 

22        if((sb.st_mode & S_IFMT) == S_IFDIR){

23           if(chmod(argv[i], sb.st_mode | READ | EXECUTE) == -1)

24               errExit("chmod");

25        }

26 

27        if((sb.st_mode & S_IFMT) == S_IFREG){

28           if(chmod(argv[i], sb.st_mode | READ) == -1)

29               errExit("chmod");

30           if((sb.st_mode & S_IXUSR) || (sb.st_mode & S_IXGRP) || (sb.st_mode & S_IXOTH))

31               if(chmod(argv[i], sb.st_mode | EXECUTE) == -1)

32                   errExit("chmod");

33        }

34     }

35 

36     exit(EXIT_SUCCESS);

37 }
View Code

结果:

[lan@alan tlpi]$ ls -ld dir file prog

d--------- 2 lan lan 4096 Jul 18 12:31 dir

-r-------- 1 lan lan    0 Jul 18 12:31 file

-r-x------ 1 lan lan    0 Jul 18 12:31 prog

[lan@alan tlpi]$ ./15.6 dir file prog

[lan@alan tlpi]$ ls -ld dir file prog

dr-xr-xr-x 2 lan lan 4096 Jul 18 12:31 dir

-r--r--r-- 1 lan lan    0 Jul 18 12:31 file

-r-x--x--x 1 lan lan    0 Jul 18 12:31 prog

-------先把一个小坑填了,好久没有写博客了,这段时间找实习,准备考试。。。终于忙完了。。。。值得思考的事情太多太多了。。。。打算写一篇总结,终结这半年的事。。。。

-------继续努力吧,努力以后才不会后悔。。。。继续巩固Linux系统编程,多看书,多代码,多思考!!!!!!

 

 

你可能感兴趣的:(linux)