前述:
本文並不是為了詳細講解每個函式的細節,細節可參考man手冊或者《unix環境高階程式設計》
一、開啟或者建立檔案
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
注:僅當建立新檔案時才使用mode_t引數,mode_t受檔案模式建立遮蔽字影響,可參考umask命令或umask函式。
二、關閉檔案
#include
int close(int fd);
注:關閉乙個檔案時還會釋放該程序加在該檔案上的所有記錄鎖。當乙個程序終止時,核心自動關閉它所有的開啟檔案。
三、設定乙個開啟檔案的偏移量
#include
#include
off_t lseek(int fd, off_t offset, int whence);
注:lseek僅將當前的檔案偏移量記錄在核心,它並不引起任何i/o操作。檔案偏移量可以大於檔案的當前長度,在這種情況下,對該檔案的下一次寫將加長該檔案,並在檔案中構成乙個空洞,檔案中的空洞並不要求在磁碟上占用儲存區。
四、讀檔案
#include
ssize_t read(int fd, void *buf, size_t count);
注:讀資料成功會使偏移量增加實際讀的位元組數。
五、寫檔案
#include
ssize_t write(int fd, const void *buf, size_t count);
注:寫資料成功會使偏移量增加實際寫的位元組數。
六、多執行緒下的讀寫原子性
#include
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
注:本質上就是lseek與read/write結合了,可參考文章:
七、複製檔案描述符
#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
注:返回的新檔案描述符與引數oldfd共享同乙個檔案表項
八、沖洗核心緩衝區
#include
void sync(void);
int fsync(int fd);
注:sync只是將修改過的塊緩衝區排入寫佇列,然後就返回,並不等待實際寫磁碟操作結束。fsync函式只對由檔案描述符fd指定的乙個檔案起作用,並且等待寫磁碟操作結束才返回。fsync可用於資料庫這樣的應用程式。
九、改變已經開啟檔案的屬性
#include
#include
int fcntl(int fd, int cmd, ... /* arg */ );
注:fcntl函式有以下五個功能
1.複製乙個已有的描述符
2.獲取/設定檔案描述符標誌位
3.獲取/設定檔案狀態標誌位(cmd=f_getfl或f_setfl), 最常用的就是套接字設定非阻塞或者阻塞
4.獲取/設定非同步i/o所有權
5.獲取/設定記錄鎖
十、獲取檔案的資訊結構
#include
#include
#include
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
注:使用stat函式最多的地方就是ls -l命令,用其可以獲得有關乙個檔案的所有資訊。stat結構中的大多數資訊都取自i節點,檔名和i節點編號取自目錄項中。
十一、測試檔案的訪問許可權
#include
int access(const char *pathname, int mode);
注:如果測試檔案是否已經存在mode就為f_ok,否則mode就是r_ok/w_ok/x_ok的位或
十二、設定程序的檔案建立遮蔽字
#include
#include
mode_t umask(mode_t mask);
注:假設open時指定mode是0777,而當前遮蔽字是0022,那麼建立成功的檔案就是0755
十三、更改檔案的訪問許可權
#include
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
十四、更改檔案的使用者id和組id
#include
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
十五、檔案截斷
#include
#include
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
十六、刪除檔案
#include
int remove(const char *pathname);
注:只有當程序關閉該檔案或者程序終止時,該檔案的內容才會被真正刪除。
十七、檔案重新命名
#include
int rename(const char *oldpath, const char *newpath);
注:檔案或者目錄都適用
十八、建立和讀取符號鏈結
#include
int symlink(const char *oldpath, const char *newpath);
#include
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
注:引數要用絕對路徑,建立函式symlink的功能類似ln命令。讀取函式readlink組合了open/read/close的所有操作。
十九、建立和刪除目錄
#include
#include
int mkdir(const char *pathname, mode_t mode);
#include
int rmdir(const char *pathname);
注:mkdir建立目錄,rmdir刪除目錄
二十、更改程序的當前工作目錄
#include
int chdir(const char *path);
int fchdir(int fd);
注:每個程序都有乙個當前工作目錄,工作目錄是程序的乙個屬性,可通過lsof檢視cwd項
二十一、檔案的訪問和修改時間更改
#include /* definition of at_* constants */
#include
int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);
int futimens(int fd, const struct timespec times[2]);
end
Linux 下檔案操作
include include include include include include include include include define s 100 void treedisplay void treecreat void filecreatopen void fileread ...
Linux下檔案操作
1.linux下檔案操作的途徑 1 通過底層檔案系統來實現,要求熟悉底層檔案系統的結構,並且編寫大量 來完成 2 通過呼叫shell來完成,訪問shell介面,但shell返回的資訊不便於程式的分析 3 通過系統呼叫來實現,能夠完成相應的功能,並且返回足夠的資訊 2.linux下檔案操作的方式 1 ...
Linux下檔案操作
1.linux下檔案操作的途徑 1 通過底層檔案系統來實現,要求熟悉底層檔案系統的結構,並且編寫大量 來完成 2 通過呼叫shell來完成,訪問shell介面,但shell返回的資訊不便於程式的分析 3 通過系統呼叫來實現,能夠完成相應的功能,並且返回足夠的資訊 2.linux下檔案操作的方式 1 ...