1、lseek
一、每個打開的文件都一個與之相關的"文件位置"。
二、文件位置一般狀況是一個非負整數,用來度量文件從開始到結束的字節數。
三、文件的讀寫操做都是從當前的文件位置開始的,根據所讀寫的字節數移動文件的位置。
四、當使用open打開文件時除非設置O_APPEND參數,不然文件位置一概在開頭。
五、使用fseek/lseek僅是將文件位置記錄在內核中,並不引起任何I/O操做。
六、若是越過文件末尾位置寫入數據,將在文件中造成黑洞,它不佔用磁盤空間,但計算在文件大小內。
off_t lseek(int fd, off_t offset, int whence);
功能:調用文件的位置
fd:文件描述符
offset:偏移值
whence:基準點
SEEK_SET 開頭位置
SEEK_CUR 當前位置
SEEK_END 末尾位置
返回值:當前文件位置
2、文件描述符的複製
int dup(int oldfd);
功能:複製文件描述符
oldfd:被複制的文件描述符
返回值:新複製出的文件描述符(操做系統隨機分配的),失敗返回-1。
int dup2(int oldfd, int newfd);
功能:複製文件描述符
oldfd:被複制的文件描述符
newfd:指定新複製出的文件描述符,若是newfd已經打開,則先關閉再複製。
返回值:新複製出的文件描述符(操做系統隨機分配的),失敗返回-1。
3、文件同步
一、大多數磁盤進入讀寫時都會有緩衝機制,當咱們寫入文件時實際上是寫入到了緩衝區裏並無寫到磁盤中,直到緩衝區滿才排隊寫入到磁盤中。
二、這樣作的處是下降了寫操做的次數,提升程序的運行效率,但也形成了磁盤與文件的內容不一樣步,這樣可能會形成A程序數據已經寫入,但B程序讀不到。
三、sync/fsync/fdatasync用於強制把緩衝區的內容同步到磁盤中。
void sync(void);
功能:把因此有修改過的文件同步到磁盤中,因此待同步文件會排隊把數據同步的磁盤,而sync不會等到全部文件同步完成後纔回,而是當即返回。
int fsync(int fd);
功能:指定某個文件的內容同步到磁盤,同步完成後才返回。async
int fdatasync(int fd);
功能:指定某個文件的內容同步到磁盤,同步完成後才返回,但只同步文件的數據,不一樣步文件的屬性。
4、獲取文件的屬性
int stat(const char *path, struct stat *buf);
功能:根據文件的路徑,獲取文件的屬性
int fstat(int fd, struct stat *buf);
功能:根據文件描述符,獲取文件的屬性
int lstat(const char *path, struct stat *buf);
功能:根據文件的路徑,獲取軟連接文件的屬性。
注意:stat會跟蹤獲取軟連接的目標文件屬性,而lstat只獲取軟連接文件的。
文件屬性結構體struct stat:
dev_t st_dev; // 設備號
ino_t st_ino; // i節點精心
mode_t st_mode; // 文件類型和權限
nlink_t st_nlink; // 硬連接數
uid_t st_uid; // 屬主id
gid_t st_gid; // 屬組id
dev_t st_rdev; // 特殊設置id
off_t st_size; // 文件的大小
blksize_t st_blksize; // 系統IO塊數
blkcnt_t st_blocks; // 512字節塊數
time_t st_atime; // 最後訪問時間
time_t st_mtime; // 最後修改時間
time_t st_ctime; // 最後屬性修改時間函數
時間轉換:
struct tm *localtime(const time_t *timep);
功能:把time_t類型的時間轉換成時間結構體
struct tm 結構體:
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst;
5、權限屏蔽碼
當使用open/creat建立文件時,所設置的文件權限會減掉權限屏幕碼所設置的權限。
如何查看權限屏幕碼:
一、命令:umask
二、函數:mode_t umask(mode_t mask);
功能:修改權限屏蔽碼
返回值:修改爲功後的權限屏蔽碼
注意:只是針對當前進程,而不會修改系統的權限屏蔽碼
6、修改文件權限
int chmod(const char *path, mode_t mode);
功能:根據文件的路徑修改文件的權限
int fchmod(int fd, mode_t mode);
功能:根據文件描述符修改文件的權限
7、修改文件的屬主和屬組
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);
功能:根據文件的路徑修改文件的屬主和屬組,只針對連接文件修改
注意:普通用戶沒有修改的權限
8、修改文件的大小
int truncate(const char *path, off_t length);
功能:根據文件路徑,修改文件的大小,多餘的部分截取掉。
int ftruncate(int fd, off_t length);
功能:根據文件描述符,修改文件的大小,多餘的部分截取掉。
注意:若是要修改後大小超出文件本來的大小,就會造成黑洞。
9、建立刪除硬連接文件
int link(const char *oldpath, const char *newpath);
功能:建立硬連接文件
oldpath:被連接的文件路徑
newpath:連接文件的路徑
int unlink(const char *pathname);
功能:刪除連接文件
int remove(const char *pathname);
功能:根據文件路徑刪除文件
int rename(const char *oldpath, const char *new‐path);
功能:爲文件重命名
注意:普通文件就一種連接數量只有一個的硬連接文件,因此unlink也能用來刪除普通文件。
10、軟件連接文件的建立
硬連接文件就一個文件名,是目錄文件中的一個條目,而軟連接文件是一個獨立的文件,裏面記錄的是被連接的路徑。
int symlink(const char *oldpath, const char *newpath);
功能:建立軟連接文件,連接目標能夠不存在
oldpath:被連接文件能夠不存在,只要最終建立出來,連接文件就能正常訪問
newpath:軟連接文件路徑。
ssize_t readlink(const char *path, char *buf,size_t bufsiz);
功能:讀取軟連接文件的信息到buf中
buf:數據的存儲位置
bufsiz:buf的大小
返回值:成功讀取到的字節數
10、建立空目錄/刪除空目錄
int mkdir(const char *pathname, mode_t mode);
功能:建立空目錄
pathname:路徑
mode:目錄的權限
int rmdir(const char *pathname);
功能:刪除空目錄,只能刪除目錄。
注意:操做系統沒有提供刪除非空目錄的方法。
ui