1. 程式人生 > >Linux檔案操作學習總結

Linux檔案操作學習總結

檔案型別:普通檔案(文字檔案,二進位制檔案)、目錄檔案、連結檔案、裝置檔案、管道檔案。

檔案的許可權:讀、寫、執行

檔案的相關資訊:目錄結構、索引節點、檔案資料

索引節點的stat結構

struct stat{

dev_t st_dev;//檔案使用的裝置號

ino_t st_inl;//索引節點號

mode_t st_mode;//檔案訪問許可權

nlink_t st_nlink;//檔案的硬連結數

uid_t st_uid;//所用者使用者識別號

gid_t st_gid;//組識別號

dev_t st_rdev;//裝置檔案的裝置號

off_t st_size;//以位元組為單位的檔案容量

unsigned long st_blksize;//

包含該檔案的磁碟塊的大小

unsigned long st_blocks;//檔案所佔的磁碟塊

time_t st_atime;//最後一次訪問該檔案的時間

time_t st_mtime;//最後一次修改該檔案的時間

time_t st_ctime;//最後一次改變該檔案狀態的時間

} ;

在該結構體中,st_dev對應於每一個檔名,代表包含這個檔名和相應的索引節點的檔案系統的裝置號,st_rdev則只有字元裝置和快裝置具有,表示的是實際裝置的裝置號

檔案操作相關函式

檔案建立

函式int creat(const char *pathname,mode_t mode);

標頭檔案:sys/types.h     sys/stat.h   fcntl.h

說明:

    mode取值如下:

mode取值

含義

S_IRUSR

檔案所有者的讀許可權

S_IWUSR

檔案安所有者的寫許可權

S_IXUSR

檔案所有者的執行許可權

S_IRGRP

檔案所有者同組使用者的讀許可權

S_IWGRP

檔案所有者同組使用者的寫許可權

S_IXGRP

檔案所有者同組使用者的執行許可權

S_IROTH

其他使用者的讀許可權

S_IWOTH

其他使用者的寫許可權

S_IXOTH

其他使用者的執行許可權

Linux系統中還定義了幾個許可權組合:

S_IRWXU =(S_IRUSR|S_IWUSR|S_IXUSR)

S_IRWXG =(S_IWGRP|S_IWGRP|S_IXGRP)

S_IRWXO=(S_IROTH|S_IWOTH|S_IXOTH)

當呼叫成功時,返回該檔案的描述符,失敗返回-1,此時檔案以只讀方式開啟。

檔案開啟

函式:1 int open( const char *pathname,int flags);

2int open(const char *pathname,int flags,mode_t mode);

標頭檔案:sys/types.h     sys/stat.h   fcntl.h

說明:flags用於描述檔案開啟引數,通過按位邏輯加得到,其中O_RDONLY,O_WRONLYO_RDWR3個值必需包含其中一種。flags取值如下:

flags取值

含義

O_RDONLY

以只讀方式開啟

O_WRONLY

以只寫方式開啟

O_RDWR

以讀寫方式開啟

O_CREAT

若所開啟檔案不存在,則建立此檔案

O_EXCL

若開啟檔案時設定了O_CREAT位且該檔案存在,則導致失敗

O_NOCTTY

若在開啟tty時程序沒有控制tty則不控制終端

O_TRUNC

若以只寫或讀寫方式開啟一個已存在檔案時,將該檔案截至0

O_APPEND

以追加的方式開啟,將檔案新增內容時將指標置於檔案末尾

O_NONBLOCK

用於非阻塞介面I/O,若操作不能無延遲的完成,則在操作前返回

O_NODELAY

同O_NONBLACK

O_SYNC

只在資料被寫入外存或其他裝置之後才返回

當呼叫成功時,返回要開啟檔案的描述符,呼叫失敗返回-1,並置errno為相應錯誤號。

檔案關閉

函式:int closeint fd;

標頭檔案:unistd.h

說明:

成功時返回0,失敗時返回-1,並置errnoEBADF.當開啟一個檔案是,該檔案描述中的引用計數加1,關閉一個檔案時,該檔案的引用計數減1,當引用計數為0時,close呼叫不僅釋放該檔案的描述符,還將釋放該檔案所佔的描述表項。

檔案寫操作

函式:ssize_t write(int fd,void *buf,size_t count);

標頭檔案:unistd.h

說明: 呼叫成功返回所寫入段位元組數,失敗返回-1 ,並設定相應的errno

檔案讀操作

函式:ssize_t read(int fd ,void *buf,size_t count);

標頭檔案:unistd.h

說明:呼叫成功返回所讀取的位元組數,失敗返回-1,並設定相應的errno

檔案定位操作

函式:off_t lseek(int fildes.off_t offset,int whence);

標頭檔案:unistd.h

說明:呼叫成功返回相對於檔案開頭的實際偏移量,失敗返回-1,並設定相應errnowhence取值如下:

Whence取值

含義

SEEK_SET

從檔案開頭計算偏移量;

SEEK_CUR

從當前位置計算偏移量;

SEEK_END

從檔案的末尾計算偏移量

檔案屬性修改

函式:(1) int chown(const char *pathname,uid_t owner,gid_t group);

      (2) int fchown(int fd,uid_t owner,gid_t group);

標頭檔案:sys/types.h    unistd.h

說明:改變檔案的所有者,由於涉及許可權問題,只有root使用者可以呼叫chownfchown來任意改變一個檔案的所有者及所屬的組,普通使用者沒有這個許可權,普通使用者只能修改自己所有的檔案的組識別號,切只能在其所屬的組中進行選擇。

函式:(1)int chmod(char *pathname,mode_t mode)

      (2)int fchmod(int fd,mode_t mode;

標頭檔案:sys/types.h    unistd.h

說明: 改變檔案的訪問許可權,關於許可權的設定和chmod命令類似,呼叫成功返回0,失敗返回-1,並設定errno

檔案重新命名

函式:int rename( const char *oldname,const char *newname);

標頭檔案:stdio.h

說明:newnameoldname指向相同,則rename呼叫不做任何操作成功返回。

oldname指向

newname指向檔案不存在

newname指向普通檔案

newname指向目錄檔案

oldname指向普通檔案

檔案被重新命名

檔案重新命名

錯誤返回

oldname指向目錄檔案

檔案重新命名

錯誤

newname所指向的目錄檔案為空目錄則該目錄被刪除,oldname被重新命名,否則出錯返回

dupdup2呼叫

函式:(1)int dup(int fd); (2) int dup2( int fd,int fd2);

標頭檔案:unistd.h

說明:該呼叫都將複製檔案描述符,兩個呼叫成功執行時都將返回新得到的檔案描述符,其區別在於(2)可以預先制定檔案描述符fd2,如果fd2正在被使用,則先關閉fd2,如果fd2fd相同,則不關閉該檔案正常返回;

statfstatlstat呼叫

函式:(1) int stat(const char *pathname,struct stat *sbuf);

       (2) int fstat(int fd,struct stat *sbuf);

       (3) int lstat(const char *pathname,struct stat*buf);

標頭檔案:sys/types.h     sys/stat.h   unistd.h

說明:對於lstat而言,當訪問一個符號連結時,lstat只返回連結本身的資訊,而statfstat將追蹤到連結的末端檔案,也就是所連線的檔案。

fsync呼叫

函式:int fsync(int fd);

標頭檔案:unistd.h

說明:將儲存在緩衝區內的要寫入檔案描述符fd的所有資料重新整理到要寫入的檔案中,當呼叫成功返回0,呼叫失敗返回-1,並設定errno

flock呼叫

函式:int flock(int fd,int operation);

標頭檔案:sys/types.h

說明:將檔案描述符所對應的檔案加鎖或解鎖,operation用於表示不同的上鎖或解鎖方式,取值如下:

LOCK_SH:共享鎖    LOCK_EX:獨佔鎖   LOCK_UN:解鎖

一個程序對一個檔案只能有一個獨佔鎖,但可以有多個共享鎖,如果一個程序不試圖去鎖一個已經被上鎖的檔案,就不可以對其訪問。當呼叫成功時返回0,失敗時返回-1

fcntl呼叫

函式:(1) int fcntl(int fd,int cmd);

       (2) int fcntl(int fd,int cmd,long arg);

標頭檔案:unistd.h   fcntl.h

說明:引數arg為可選引數,對應於cmd的某些可取值,對應於執行某些特殊操作;呼叫成功時返回0,失敗是返回-1,並設定errno,此外,fcntl呼叫能完成的大部分操作都可以用其他呼叫來完成。cmd的取值如下:

cmd取值

相應操作

F_DUPFD

複製檔案描述符

F_GETFD

獲取檔案描述符

F_SETFD

設定close-on-exec標誌

F_GETFL

獲取open呼叫設定的標誌

F_SETFL

設定open呼叫設定的標誌

F_GETLK

獲取離散的檔案鎖

F_SETLK

設定獲得離散的檔案鎖,不等待

F_SETLKW

設定獲得離散的檔案鎖,必要時等待

F_GETOWN

檢索將收到SIGIO和SIGURG訊號燈程序id或程序組號

F_SETOWN

設定程序id或程序組號

特殊檔案操作

建立目錄

函式:int mkdir(const char *pathname,mde_t mode);

標頭檔案:sys/types.h   sys/stat.h

說明:mode的值與表示其許可權,mode的值由當前的umask的值得反值與設定的mode相與確定,該目錄的所有者為呼叫mkdir建立它的程序的有效使用者標識號。呼叫成功返回0,失敗返回-1,並設定errno

刪除目錄

函式:int rmdir(const char *pathname);

標頭檔案:unistd.h

說明:當目錄為空時,呼叫此函式可以將其刪除,否則將刪除失敗。呼叫成功返回0,失敗返回-1,並設定errno

開啟目錄

函式:DIR * opendir(const char *pathname);

標頭檔案: sys/types.h    dirent.h

說明:呼叫返回值為DIR型別,用於指向目錄檔案的結構指標。呼叫成功返回目錄指標,呼叫失敗返回NULL

關閉目錄

函式:int closedir( DIR *dp);

標頭檔案:sys/types.h    dirent.h

說明:引數為要關閉的目錄檔案指標,該指標有opendir返回,呼叫成功返回0,失敗返回-1,並設定errno

讀取目錄

函式:struct dirent * readdir(DIP *dp);

標頭檔案:sys/types.h    dirent.h

說明:用於訪問目錄指標dp的目錄檔案,其返回值為dirent結構體指標,dirent結構如下:

struct drent{

ino_t  d_ino;//目錄節點號

off_t d_off;//節點偏移量

unsigned short d_reclen;//記錄長度

unsigned char d_type;//檔案型別

char d_name[256];//目錄連結的檔名

}

當目錄中沒有更多連結時,返回0

建立硬連結

函式:int  link(char *pathname1,char *pathname2);

標頭檔案:unistd.h

說明:pathname1為已經存在的檔案,pathname2為要建立的連結,pathname1pathname2之西那個的路徑必須在同一個檔案系統中,只用超級使用者才能建立一個指向目錄檔案的新的連線檔案。呼叫成功返回0,失敗返回-1

移除硬連結

函式:int unlink(char *pathname);

標頭檔案:unistd.h

說明:要移除一個檔案的連結,必須要有對該目錄的寫許可權和執行許可權,當呼叫unlink時,目錄的索引節點計數將減1,當連結計算器為0時,索引節點和檔案資料塊將被釋放。

建立符號連結

函式:int symlink(const char *actualpath,const char *sympath);

標頭檔案:unistd.h

說明:acturalpath為真實存在的檔案,sympath為新建立的指向acturalpath的符號連結,呼叫成功返回0,失敗返回-1,並設定errno

開啟連結

函式:int readlink(const char *pathname, char *buf,int bufsize);

標頭檔案:unistd.h

說明:呼叫成功時,返回值為寫入緩衝區的位元組數,呼叫失敗時,返回值為0,並設定errno