linux下檔案操作需要關注的函式

2021-07-16 01:17:14 字數 3927 閱讀 2389

前述:

本文並不是為了詳細講解每個函式的細節,細節可參考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 ...