描述文件系統的其他特徵和文件的性質
1.stat、fstat和lstat函數
#include <sys/stat.h>
int stat(const char* restrict pathname, struct stat* restrict buf);
int fstat(int filedes, struct stat* buf);
int lstat(const char* restrict pathname, struct stat* restrict buf);
/*成功則返回0,出錯則返回-1 */
給出pathname則stat函數就返回一次命名文件有關的信息結構,fstat函數獲取在描述符filedes上打開文件的有關信息。lstat函數類似於stat,但是當命名的文件是一個符號鏈接時,lstat返回該符號鏈接的有關信息,而不是由該符號鏈接引用文件的信息。
struct stat {
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
blksize_t st_blksize;
blkcnt_t st_blocks;
mode_t st_attr;
};
2.文件類型
unix系統中的文件類型包括:
(1)普通文件(regular file),最常用的文件類型。
(2)目錄文件(directory file),包含了其他文件的名字以及指向與這些文件有關信息的指針。
(3)塊特殊文件(block special file),提供對設備帶緩衝的訪問,每次訪問以固定長度爲單位。
(4)字符特殊文件(character special file),提供對設備不帶緩衝的訪問,每次訪問長度可變。系統中的所有設備要麼是字符特殊文件,要麼是塊特殊文件。
(5)FIFO,用於進程間通信,有時也將其稱爲命名通道(named pipe)。
(6)套接字(socket),用於進程間的網絡通信,套接字也可用於在一臺宿主機上進程之間的非網絡通信。
(7)符號鏈接(symbolic link),這種類型指向另一文件。
文件類型信息包含在stat結構的st_mode成員中,可以用表4-1中宏確定文件類型,這些宏的參數都是stat結構中的st_mode成員。
Figure 4.1. File type macros in <sys/stat.h>
Macro
Type of file
S_ISREG()
regular file
S_ISDIR()
directory file
S_ISCHR()
character special file
S_ISBLK()
block special file
S_ISFIFO()
pipe or FIFO
S_ISLNK()
symbolic link
S_ISSOCK()
socket
3.文件訪問權限
Figure 4.6. The nine file access permission bits, from <sys/stat.h>
st_mode mask
Meaning
S_IRUSR
user-read
S_IWUSR
user-write
S_IXUSR
user-execute
S_IRGRP
group-read
S_IWGRP
group-write
S_IXGRP
group-execute
S_IROTH
other-read
S_IWOTH
other-write
S_IXOTH
other-execute
4.access函數
access函數按照實際用戶ID和實際組ID進行訪問權限測試。
#include <unistd.h>
int access(const char* pathname, int mode);
/* 成功則返回0,出錯則返回-1 */
Figure 4.7. The mode constants foraccess function, from <unistd.h>
mode
Description
R_OK
test for read permission
W_OK
test for write permission
X_OK
test for execute permission
F_OK
test for existence of file
5.umask函數
umask函數爲進程設置文件模式創建屏蔽字,並返回以前的值(沒有出錯返回)。
#include <sys/stat.h>
mode_t umask(mode_t cmask);
/* 返回以前的文件模式創建屏蔽字 */
這兩個函數使我們可以更改現有文件的訪問權限:
#include <sys/stat.h>
int chmod(const char* pathname, mode_t mode);
int fchmod(int filedes, mode_t mode);
/* 成功則返回0,出錯則返回-1 */
chmod在指定的文件上進行操作,而fchmod函數則對已打開的文件進行操作。爲了改變一個用戶的權限位,進程的有效用戶ID必須等於文件的所有者ID,或者該進程必須具有超級用戶權限。
參數mode是表4-11中所示常量的某種按位或運算構成的。
7.chown、fchown和lchown函數
用於更改文件的用戶ID和組ID。
#include <unistd.h>
int chown(const char* pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char* pathname, uid_t owner, gid_t group);
/* 成功則返回0,出錯返回-1 */
8.文件長度
stat結構成員st_size表示以字節爲單位的文件長度。此字段只對普通文件、目錄文件和符號鏈接有意義。
9.文件的時間
對每個文件保持三個時間字段:
(1)st_atime,文件數據的最後訪問時間,例如read
(2)st_mtime,文件數據的最後修改時間(修改文件的實際內容),例如write
(3)st_ctime,i節點狀態的最後更改時間,例如chmod、chown
一個文件的訪問和修改時間可以用utime函數更改
10.mkdir和rmdir函數
用mkdir函數創建目錄,用rmdir函數刪除目錄:
#include <sys/stat.h>
int mkdir(const char* pathname, mode_t mode);
/* 成功返回0,出錯則返回-1 */
刪除一個空目錄:
#include <sys/stat.h>
int rmdir(const char* pathname);
/* 成功返回0,出錯則返回-1 */
11.讀目錄
對某個目錄具有訪問權限的任一用戶都可讀該目錄:
#include <dirent.h>
DIR *open(const char* pathname);
/* 成功返回指針,出錯則返回NULL */
struct dirent *readdir(DIR *dp);
/* 成功則返回指針,若在目錄結尾或出錯則返回NULL */
void rewinddir(DIR *dp);
int closedir(DIR *dp);
/* 成功則返回0,出錯則返回-1 */
long telldir(DIR *dp);
/* 與dp關聯的目錄中的當前位置 */
void seekdir(DIR *dp, long loc);
頭文件<dirent.h>中定義的dirent結構與實現有關,典型的UNIX實現對此結構所作的定義至少包含下列兩個成員:
struct dirent{
ino_t d_ino; /* i-node number */
char d_name[NAME_MAX+1]; /*null-terminated filename */
}
小結:
對文件的所有屬性以及操作文件的所有函數有完整的瞭解對UNIX編程是非常重要的。