《Linux/Unix系統編程手冊》讀書筆記9(文件屬性)

《Linux/Unix系統編程手冊》讀書筆記 目錄html

在Linux裏,萬物皆文件。因此文件系統在Linux系統佔有重要的地位。本文主要介紹的是文件的屬性,只是稍微說起一下文件系統,往後若是有更深刻的研究必定會寫出來。node

下圖爲磁盤分區與文件系統的關係程序員

文件系統中的文件(目錄)在i-node表上都有惟一的記錄(i-node)。i-node經過數據塊指針指向數據塊,這些數據塊就是該i-node對應的文件的數據。編程

i-node與數據塊的關係以下:ide

由於Linux支持不少類型的文件系統,可是每種文件系統的實現存在差別。爲了解決這種差別,內核提供了虛擬文件系統,經過在應用程序與文件系統之間添加一個抽象層來讓程序員在編寫應用程序的時候不用考慮文件系統的種類。post

初步瞭解文件系統後,進入正題-----文件屬性spa

正由於萬物皆文件,咱們不少時候須要獲取文件的信息,以便知道它是普通文件仍是目錄文件,或者想知道它的時間戳等信息。這時候咱們能夠經過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。code

pathname爲文件名,對於lstat,若是文件爲符號連接的時候返回的爲該連接的信息,而不是指向的文件。htm

fstat則是獲取打開文件描述符對應的文件的信息。

 接着來看看stat結構的格式:

其中將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系統編程,多看書,多代碼,多思考!!!!!!

相關文章
相關標籤/搜索