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);
(2)int open(const char *pathname,int flags,mode_t mode);
標頭檔案:sys/types.h sys/stat.h fcntl.h
說明:flags用於描述檔案開啟引數,通過按位邏輯加得到,其中O_RDONLY,O_WRONLY和O_RDWR,3個值必需包含其中一種。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 close(int fd);
標頭檔案:unistd.h
說明:
成功時返回0,失敗時返回-1,並置errno為EBADF.當開啟一個檔案是,該檔案描述中的引用計數加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,並設定相應errno。whence取值如下:
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使用者可以呼叫chown和fchown來任意改變一個檔案的所有者及所屬的組,普通使用者沒有這個許可權,普通使用者只能修改自己所有的檔案的組識別號,切只能在其所屬的組中進行選擇。
函式:(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
說明:當newname和oldname指向相同,則rename呼叫不做任何操作成功返回。
oldname指向 |
newname指向檔案不存在 |
newname指向普通檔案 |
newname指向目錄檔案 |
oldname指向普通檔案 |
檔案被重新命名 |
檔案重新命名 |
錯誤返回 |
oldname指向目錄檔案 |
檔案重新命名 |
錯誤 |
newname所指向的目錄檔案為空目錄則該目錄被刪除,oldname被重新命名,否則出錯返回 |
dup和dup2呼叫
函式:(1)int dup(int fd); (2) int dup2( int fd,int fd2);
標頭檔案:unistd.h
說明:該呼叫都將複製檔案描述符,兩個呼叫成功執行時都將返回新得到的檔案描述符,其區別在於(2)可以預先制定檔案描述符fd2,如果fd2正在被使用,則先關閉fd2,如果fd2和fd相同,則不關閉該檔案正常返回;
stat、fstat和lstat呼叫
函式:(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只返回連結本身的資訊,而stat和fstat將追蹤到連結的末端檔案,也就是所連線的檔案。
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為要建立的連結,pathname1和pathname2之西那個的路徑必須在同一個檔案系統中,只用超級使用者才能建立一個指向目錄檔案的新的連線檔案。呼叫成功返回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。