系統文件函數
stat函數
指針如果沒有const一般表示傳出參數,如果加const表示傳入參數
struct stat
dev_t st_dev
文件設備編號ino_t st_ino
節點
inode號是唯一的,每個inode節點的大小一般是128字節活著256字節,一般文件每2KB就設置一個inodemode_t st_mode
文件類型和存取權限,16bite,4bite文件類型 4bit特殊權限位 3*4bit訪問權限nlink_t st_nlink
文件的硬鏈接數目uid_t st_uid
用戶IDgid_t st_gid
組IDdev_t st_rdev
若文件為設備文件,則為其設備編號off_t st_size
文件字節數blksize_t st_blksize
塊大小(文件系統的I/O緩沖區大小)blkcnt_t st_blocks
快數time_t st_atime
最后一次訪問時間time_t st_mtime
最后一次修改時間time_t st_ctime
最后一次改變時間:指屬性,包括訪問,修改內容,修改類型等
stat
函數和lstat
函數的區別:對于軟鏈接,前者是穿透(追蹤)函數,后者是不穿透(不追蹤)函數
access測試文件是否有某種權限
chmod 改變文件權限
可以使用第3章strtol
函數將字符串轉化為數字
chown 改變文件所有者
可以查看passwd
文件(詳見手冊第5章)
truncate函數
文件的截取和拓展
#include <unistd.h>
#include <sys/types.h>int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
多出來的方式仍然是以空洞的方式儲存
link函數
創建硬鏈接
#include <unistd.h>int link(const char *oldpath, const char *newpath);#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>int linkat(int olddirfd, const char *oldpath,int newdirfd, const char *newpath, int flags);
symlink 函數
創建軟鏈接
readlink 函數
讀一個軟鏈接
unlink 函數
如果是軟鏈接,則刪除軟鏈接
如果是硬鏈接,則刪除當前硬鏈接,硬鏈接數減一,當減為0時,釋放數據塊和inode
使用unlink可以制作臨時文件:如果文件硬鏈接數為0,但有進程已經打開文件,并且持有文件描述符,則等該進程關閉文件時kernel才真正刪除文件,因此可以先open|creat一個文件,然后再使用文件描述符操作該文件,同時使用unlink
函數刪去,則創造出了一個臨時文件
每一次unlink
其實是刪除一個目錄項(denty),當所有占用該文件的進程使用結束或者進程關閉文件才會失效
操作文件的時候需要注意文件指針,尤其是寫操作以后想要讀取的時候
rename函數
目錄操作函數
chdir函數
相當于cd命令,改變的是所在進程的路徑,而不是終端的路徑
getcwd函數
相當于pwd命令,獲取進程當前目錄
mkdir函數
需要注意創建的目錄需要有執行權限,否則無法進入目錄
rmdir函數
刪除一個空目錄
opendir函數(下面開始變成手冊第三章的函數了)
成功返回一個DIR
指針,失敗返回NULL
readdir函數
讀取目錄內容,返回一個結構體struct dirent
ino_t ino
目錄的inodeff_t d_off
目錄文件開頭到此目錄進入點的位移signed short int d_reclen
d_name的長度unsigned char d_type
文件的類型
closedir函數
dup 和dup2
查閱手冊第二章
用于復制文件描述符,可以讓多個文件描述符指向同一個文件
dup(old fd)
函數:返回一個文件描述符,指向舊文件描述符所指向的文件,返回的是所有未占用的文件描述符中最小的一個
dup2(old fd,new fd)
函數:指向新的文件描述符,如果新文件描述符原本指向一個文件則將該文件釋放,再指向舊文件描述符所指向的文件。如果new和old是同一個文件描述符則不會關閉。
雖然可能有多個文件描述符,但是只有一個文件指針
這里的文件覆蓋并不是清空,而是在原來文件上面寫
fcntl函數
改變已經打開的文件的屬性
- 復制一個現有的文件描述符
- 獲得/設置文件描述符標記
- 獲得/設置文件狀態標記
int fcntl(int fd,,int cmd,long arg)
cmd=F_GETFL
,arg=0
就可以,返回文件的狀態flag=fcntl(fd,F_GETFL,0)
cmd=F_SETFL
,arg=flag|O_APPEND/O_NONBLOCK
O_APPEND
在末尾追加
- 獲得/設置異步I/O所有權
- 獲得/設置記錄鎖