linux學習筆記之文件結構和函數

 本文參考《UNIX環境高級編程》css

 

1、基礎介紹。linux

1:文件的構成。shell

  1,首先聲明,這裏的文件和目錄,表示普通的文件和目錄。不肯定是否能夠應用到:設備,管道等特殊形式的文件(UNIX把它們也看成文件處理)。編程

  2,目錄的構成:v節點編號和文件名。緩存

    1)v節點:文件系統相關的節點。文件類型,各種文件操做函數指針。但目錄中包含的是節點編號,不是節點自己。異步

  3,文件的構成:v節點和i節點。async

    1)i節點:文件全部者,長度,磁盤實際所在位置指針等函數

    2)linux中,沒有v節點,只有兩個i節點。一個和文件系統相關,一個無關。ui

    3)連接文件的實際內容(數據塊數據)爲實際文件的文件名spa

2:文件描述符:在進程中,用來搜索文件的索引值。

  1,進程查找文件須要:記錄表,文件表,V節點表。

    1)每一個進程都會有一張記錄表。文件描述符佔用記錄標中的一項。每一項會對應一個文件表的指針。

    2)文件表:記錄文件狀態,當前偏移量,v節點指針。

      1.文件狀態表示:讀寫,添寫,同步,阻塞...

  2,經過文件描述符查找文件的流程。

    1)經過文件描述符 —— 文件表 —— 找到v節點 —— 找到數據i節點。

  3,描述符是數值上爲 非負整數。

  3,標準輸入,標準輸出,標準錯誤一般佔用0,1,2這3個端口。不少shell和應用程序都默認支持此規則。因此若是更改此規則可能會致使系統和程序沒法使用。

文件               對應描述符          POSIX的宏(include<unistd.h>) 
standard input、 0          STDIN_FILENO standard output    1          STDOUT_FILENO standard error     2          STDERR_FILENO

  4,宏OPEN_MAX 定義了最大打開文件數。描述符最大值爲:OPEN_MAX-1

 

 

2、相關操做函數。

1:函數列表。

1 打開文件
  open(const char *path, int oflag, mode_t mode);
  openat(int fd, const char *path, int oflag, mode_t mode);
  // 1 fd:文件描述符。當openat函數第二參數path爲相對路徑時使用。獲得相對路徑的前置路徑。
  // 2 oflag:有5個基本常量參數(不可多選),以及一些可選常量參數。
  // 3 openat函數使用:可使用相對路徑來訪問文件,使函數更爲靈活。
2 建立/刪除一個文件
  creat(const char *path, mode_t mode ), close( int fd )
  // 1 creat函數等效於open(path, O_WRONLY| O_CREAT | O_TURNC, mode )
  // 2 關閉文件時,還會釋放該進程在文件上添加的記錄鎖。
  // 3 當進程結束時,內核會自動關閉關聯文件。
3 讀/寫 文件
  size_t read( int fd, void *buf, size_t nbytes );
  size_t write( int fd, const void *buf, size_t nbytes );
  // 1 read函數中返回值爲 讀到的字數, 第二參數保存 讀到的字符的起始位置的指針。
  // 2 兩個函數出錯時,返回值爲-1。
  // 3 write函數僅將數據寫入緩存。寫入磁盤時間由系統控制。如指望當即寫入,須要設置:O_SYNC。
4 設置文件偏移量(針對已打開文件)
  lseek( int fd, off_t offset, int whence )
  // 1 whence有三個選項:SEEK_SET / CUR / END 分別表示 偏移量從  開始處 / 當前爲指 / 結束點  開始。
  // 2 部分操做系統默認: SEEK_SET / CUR / END 分別爲 0 / 1 / 2。
5 複製現有的文件描述符。
  int dup( int fd );
  int dup2( int fd, int fd2 );
  // 1 須要包含"unistd.h"頭文件
  // 2 複製一個現有文件描述符 到 當前最小空餘的文件描述符位。
6 將緩存區寫入磁盤
  // 默認保存在緩衝區,等待內核寫入。
  int sync( int fd );  // 發送寫入指令,但不等待寫返回。
  int fsync( int  fd ); //發送寫入指令,並等待返回。
  int fdatasync( int fd ); //僅更新數據部分,不更新文件屬性。
7 設置文件屬性(針對已打開文件)
  int fcntl( int fd, int cmd, int arg )
  // 1 複製一個已有描述符。
  // 2 get/set 文件描述符/文件狀態標誌/異步IO全部權/記錄鎖。
  // 3 修改 文件描述符/文件狀態標誌位時,注意先獲取,肯定正確,再賦值。防止出錯。
8 獲取文件相關信息。
  int stat( const char *restrict pathname, struct stat *restrict buf )
  int fstat( int fd, struct stat *restrict buf )
  int lstat( const char *restrict pathname, struct stat *restrict buf )
  int fstatat( int fd, const char *restrict pathname, struct stat *restrict buf, int flag )
  // 1 結構體 stat 保存 文件有關的信息。
  // 2 fstatat函數根據 參數flag 來決定具體做用。是上三種函數的集合體。
  // 3 lstat能夠用來獲取 符號連接 類型的文件的信息。
9 檢測實際用戶/組對文件的權限。
  int access( const char *pathname, int mode )
  int faccssat( int fd, const char *pathname, int mode, int flag )
  // 1 return : success is 0, failure is -1
  // 2 一般是由於設置ID,致使有效ID和實際ID不一樣時,纔會使用。
  // 3 faccessat函數的 參數flag 設置爲 AT_EACCESS 時,檢測的是有效ID 而非實際。
10 設置屏蔽字。
  mode_t umask( mode_t cmask );
  // 1 設置屏蔽字。進程建立一個文件時,使用此屏蔽字來肯定該文件的讀寫權限
  // 2 使用四個8進制數表示。分別爲:文件類型,用戶權限,組權限,其餘組權限。
11 更改現有文件權限
  int chmod( const char* pathname, mode_t mode )
  int fchmod( int fd, mode_t mode )
  int fchmodat( int fd, const char *pathname, mode_t mode, int flag )
  // 1 flag 爲 AT_SYMLINK_NOFOLLOW時,函數不跟隨符號連接。
12 更改用戶/組ID
  int chown( const char *pathname, uid_t owner, gid_t group )
  int fchown( int fd, uid_t owner, gid_t group )
  int fchownat( int fd, const char* pathname, uid_t owner, gid_t group, int flag )
  int lchown( const char* pathname, uid_ owner, gid_t group )
13 設置文件大小。
  int truncate( const char* pathname, off_t length )
  int ftruncate( int fd, off_t length )
14 增長/刪除文件連接
  int link( const char* existingpath, const char* newpath)
  int linkat( int efd, const char* existingpath, int nfd, const char* newpath, int flag)
  int unlink( const char* pathname)
  int unlinkat( int fd, const char *pathname, int flag)
  int remove( const char* pathname )    // 刪除文件需求:連接計數器爲0,文件爲關閉狀態
  // 1 當由進程打開文件時,文件沒法被刪除。
  // 2 流程:關閉一個文件時,內核首先檢查打開文件的進程個數;若是計數爲0,內核再檢查其連接計數,若是連接計數也爲0,則刪除該文件。
  // 3 該特性能夠用來保證,臨時文件不會被遺留下來。(由於進程關閉後,兩個計數都爲0)。
15 文件重命名
  int rename( const char *oldname, const char* newname )
  int renameat( int oldfd, const char *oldname, int newfd, const char* newname )
  // 1 不能對文件 ‘.’/‘..’ 兩個文件進行重命名。
16 建立一個符號連接
  int symlink(const char *actualpath, const char *sympath )
  int symlinkat(const char *actualpath, int fd, const char *sympath )
17 讀取符號連接自己
  ssize_t readlink( const char *restrict pathname, char *restrict buf )
  ssize_t readlinkat( int fd,  const char *restrict pathname, char *restrict buf, size_t bufsize )
18 更改文件的訪問和修改時間。
  int futimens( int fd, const struct timespac time[2] )
  int utimensat( int fd, const char *path, const struct timespac times[2], int flag)
  int utimes( const char* pathname, const struct timeval times[2] )
  // 1 time參數中,第一個爲訪問時間,第二個爲修改時間。
19 建立/刪除目錄
  int mkdir( const char* pathname, mode_t mode)
  int mkdirat( int fd, const char* pathname, mode_t mode)
  int rmdir( const char *pathname )
  // 1 需注意,rmdir的執行規則(進程打開計數,連接計數等)。
20 更改當前工做目錄(HOME)
  int chdir( const char * pathname );
  int fchdir( int fd );
  char* getcwd( char *buf, size_t size );  //經過 相對路徑 獲得 絕對路徑。 

2:歷史遺留問題:高編3章後習題沒法理解。待看完後從新嘗試解決。

相關文章
相關標籤/搜索