[Linux]APUE讀書筆記: 文件和目錄

stat, fstat, fstatat 和 lstat函數:socket

  1. stat函數返回與pathname命名文件相關的信息結構;
  2. fstat函數返回已在文件描述符fd打開文件的相關信息;
  3. lstat函數與stat函數相似,但當命名文件是一個符號連接時,返回該符號連接的相關信息;
  4. fstatat函數爲相對於當前打開目錄(有fd參數指向)的路徑名返回文件統計信息。
  5. struct stat 的具體定義以下圖:

文件類型:ide

  1. 文件類型包括:普通文件,目錄文件,塊特殊文件,字符特殊文件,FIFO,套接字和符號連接,文件類型由stat結構中的st_mode表示;
  2. 對每一個命令行參數打印文件類型:
 1 #include "apue.h"
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int                i;
 6     struct stat        buf;
 7     char             *ptr;
 8 
 9     for (i = 1; i < argc; i++)
10     {
11         printf("%s: ", argv[i]);
12         if (lstat(argv[i], &buf) < 0) 
13         {
14             err_ret("lstat error");
15             continue;
16         }
17 
18         if (S_ISREG(buf.st_mode))
19         {
20             ptr = "regular";
21         }
22         else if (S_ISDIR(buf.st_mode))
23         {
24             ptr = "directory";
25         }
26         else if (S_ISCHR(buf.st_mode))
27         {
28             ptr = "character special";
29         }
30         else if (S_ISBLK(buf.st_mode))
31         {
32             ptr = "block special";
33         }
34         else if (S_ISFIFO(buf.st_mode))
35         {
36             ptr = "fifo";
37         }
38         else if (S_ISLNK(buf.st_mode))
39         {
40             ptr = "symbolic link";
41         }
42         else if (S_ISSOCK(buf.st_mode))
43         {
44             ptr = "socket";
45         }
46         else {
47             ptr = "** unknown mode **";
48         }
49 
50         printf("%s\n", ptr);
51     }
52 
53     exit(0);
54 }
View Code

 設置用戶ID和設置組ID:函數

  1. 實際用戶ID和實際組ID登錄時取自登錄口令;有效用戶ID和有效組ID以及附屬組ID決定文件訪問權限;保存的設置用戶ID和保存的設置組ID在執行程序時包含了有效用戶ID和有效組ID的副本;
  2. 一般,有效用戶ID等於實際用戶ID,有效組ID等於實際組ID;
  3. 設置用戶ID(set-user-id):當執行此文件時,將進程的有效用戶ID設置爲文件全部者的用戶ID;設置組ID(set-group-id):當執行此文件時,將進程的有效組ID設置爲文件全部者的組ID。

新文件和目錄的全部權:測試

  1. 新文件的用戶ID設置爲進程的有效用戶ID;
  2. 對於Linux 3.2.0,默認狀況下,新文件的組ID取決於它所在的目錄的設置組ID位是否被設置,若是被設置,新文件組ID設置爲目錄的組ID,不然設置爲進程的有效組ID。

函數access和faccessat:ui

  1. access和faccessat函數是按實際用戶ID和實際組ID進行訪問權限測試的;
  2. access函數實例:
 1 #include "apue.h"
 2 #include <fcntl.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     if (argc != 2)
 7     {
 8         err_quit("usage: a.out <pathname>");
 9     }
10 
11     if (access(argv[1], R_OK) < 0)
12     {
13         err_ret("access error for %s", argv[1]);
14     }
15     else 
16     {
17         printf("read access ok\n");
18     }
19 
20     if (open(argv[1], O_RDONLY) < 0)
21     {
22         err_ret("open error for %s", argv[1]);
23     }
24     else 
25     {
26         printf("open for reading ok\n");
27     }
28 
29     exit(0);
30 }
View Code

 函數umask:spa

  1. umask函數爲進程設置文件模式建立屏蔽字;
  2. 在文件模式建立屏蔽字中爲1的位,在文件mode中相應位必定被關閉(異或);
  3. umask函數實例:
 1 #include "apue.h"
 2 #include <fcntl.h>
 3 
 4 #define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
 5 
 6 int main(void)
 7 {
 8     umask(0);
 9     if (creat("foo", RWRWRW) < 0)
10     {
11         err_sys("creat error for foo");
12     }
13 
14     umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
15     if (creat("bar", RWRWRW) < 0)
16     {
17         err_sys("creat error for bar");
18     }
19 
20     exit(0);
21 }
View Code

 函數chmod, fchmod和fchmodat:命令行

  1. chmod, fchmod和fchmodat用於更改文件的訪問權限;
  2. chmod實例函數:
 1 #include "apue.h"
 2 
 3 int main(void)
 4 {
 5     struct stat statbuf;
 6 
 7     if (stat("foo", &statbuf) < 0)
 8     {
 9         err_sys("stat error for foo");
10     }
11 
12     if (chmod("foo", (statbuf.st_mode & ~S_IXGRP | S_ISGID)) < 0)
13     {
14         err_sys("chmod error for foo");
15     }
16 
17     if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0)
18     {
19         err_sys("chmod error for bar");
20     }
21 
22     exit(0);
23 }
View Code

 函數chown,fchown,fchownat和lchown:code

  1. chown, fchown, fchownat和lchown函數用於更改文件的用戶ID和組ID,若是owner或group中的任意一個爲-1,對應ID不變;
相關文章
相關標籤/搜索