Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> unix/linux文件屬性及其系統調用

unix/linux文件屬性及其系統調用

日期:2017/2/7 9:24:54      編輯:Linux教程

TABLE 1. 獲取文件屬性(stat,fstat,lstat)

  2. 文件類型2.1 文件類型包括一下幾種2.2 文件類型測試的宏2.3 文件類型測試實例3. 文件的權限3.2 關於權限的小細節3.3 設置用戶ID和設置組ID 3.4 文件權限操作的系統調用3.4.1 umask函數3.4.2 chmod和fchmod 3.4.3 chown fchown和lchown 4. 文件的時間4.1 utime函數

  文件有其屬性,如類型,權限,長度,狀態等,本文將對此進行總結,同時學習相關的系統調用。

  1. 獲取文件屬性(stat,fstat,lstat)

  三個stat函數能夠返回文件的信息。

  [code] #include

  int stat(const char *pathname, struct stat *buf);int fstat(int filedes, struct stat *buf);int lstat(const char *pathname, struct stat *buf);返回值:成功 0失敗 -1 [/code]

  三個函數的區別是,stat 第一個參數是文件名,fstat 第一個參數文件描述符,lstat 第一參數是文件名,且他返回的是符號鏈接的信息,而不是符號鏈接引用文件的信息。

  第二個參數buf結構體指針,是一個我們必須提供的結構。其基本的形式:struct stat { mode_t st_mode; /* 文件類型和文件權限 */ ino_t st_ino; /* 與該文件關聯的inode */ dev_t st_dev; /* 保存的文件設備 */ nlink_t st_nlink; /* 該文件上硬鏈接的個數 */ uid_t st_uid; /* 文件屬主UID */ gid_t st_gid; /* 文件屬主GID */ off_t st_size; /* 文件字節數,普通文件有效 */ time_t st_atime; /* 文件上一次被訪問的時間 */ time_t st_mtime; /* 文件內容上一次被修改的時間 */ time_t st_ctime; /* 文件權限、屬主、組或內容上一次被修改的時間 */ }使用stat函數最多的可能是`ls -l`命令,來獲取一個文件的所有信息。下面我們就按照stat的內容來了解文件屬性信息。

  2. 文件類型結構體stat的st_mode裡就有文件類型的信息(st_mode同時包含文件類型和文件權限)。

  2.1 文件類型包括一下幾種1. 普通文件/regular file.最長用的文件類型。數據可以是文本也可以是二進制文件,對unix內核來說沒有區別。

  2. 目錄文件/directory file.這種文件包含了其他文件的名字和指向這些文件有關信息的指針。

  3. 塊特殊文件/block special file.這種文件類型提供對設備帶緩沖的訪問。每次訪問以固定長度為單位進行。

  4. 字符特殊文件/ character special file這種文件類型提供對設備不帶緩沖的訪問。每次訪問長度可變。

  5. FIFO這種類型文件用於進程間通信,也成為命名管道。

  6. 套接字 / socket這種文件類型用於進程間的網絡通信。

  7. 符號鏈接 / sysbolic link這種類型文件指向另一個文件。

  2.2 文件類型測試的宏對於一個文件,可以用下面的宏來確定文件類型。這些宏的參數是 stat中的st_mode成員。

  S_ISREG() 測試是否是普通文件S_ISDIR() 測試是否是目錄文件S_ISBLK() 測試是否是塊特殊文件S_ISCHR() 測試是否是字符特殊文件S_ISFIFO() 測試是否管道S_ISSOCK() 測試是套接子S_ISLNK() 測試是否是鏈接文件

  2.3 文件類型測試實例[code] filename: file_type.c #include #include #include #include

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

  { int ret;int i;struct stat stat_buf;char *p_file_type;

  for (i = 1; i < argc; i++) { if ((ret = lstat(argv[i], &stat_buf)) == -1) { fprintf(stderr, "%s ——> lstat error!\n", argv[i]);continue;} if (S_ISREG(stat_buf.st_mode))

  p_file_type = "regular";else if (S_ISDIR(stat_buf.st_mode))

  p_file_type = "dir";else if (S_ISCHR(stat_buf.st_mode))

  p_file_type = "character special";else if (S_ISBLK(stat_buf.st_mode))

  p_file_type = "block special";else if (S_ISLNK(stat_buf.st_mode))

  p_file_type = "symbolic link";else if (S_ISFIFO(stat_buf.st_mode))

  p_file_type = "fifo";else if (S_ISSOCK(stat_buf.st_mode))

  p_file_type = "socket";else p_file_type = "unknow";printf("%s ——> %s\n",argv[i], p_file_type);}

  return 0;}

  [/code]測試[code] [test@test stat_code]$ ./file_type /dev/initctl /etc/passwd /dev/sda /dev/tty /dev/log /dev/cdrom /dev/initctl ——> fifo /etc/passwd ——> regular /dev/sda ——> block special /dev/tty ——> character special /dev/log ——> socket /dev/cdrom ——> symbolic link [test@test stat_code]$ [/code] 

 

Copyright © Windows教程網 All Rights Reserved