《Linux/Unix系統編程手冊》讀書筆記 目錄
在Linux里,萬物皆文件。所以文件系統在Linux系統占有重要的地位。本文主要介紹的是文件的屬性,只是稍微提及一下文件系統,日后如果有更深入的研究一定會寫出來。
下圖為磁盤分區與文件系統的關系

文件系統中的文件(目錄)在i-node表上都有唯一的記錄(i-node)。i-node通過數據塊指針指向數據塊,這些數據塊就是該i-node對應的文件的數據。
i-node與數據塊的關系如下:

因為Linux支持很多類型的文件系統,但是每種文件系統的實現存在差異。為了解決這種差異,內核提供了虛擬文件系統,通過在應用程序與文件系統之間添加一個抽象層來讓程序員在編寫應用程序的時候不用考慮文件系統的種類。

初步了解文件系統后,進入正題-----文件屬性
正因為萬物皆文件,我們很多時候需要獲取文件的信息,以便知道它是普通文件還是目錄文件,或者想知道它的時間戳等信息。這時候我們可以通過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結構的格式:

其中將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 PRogd--------- 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 progdr-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系統編程,多看書,多代碼,多思考!!!!!!
新聞熱點
疑難解答