APUE學習——Ch4.文件和目錄

描述文件系統的其他特徵和文件的性質

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);
/* 返回以前的文件模式創建屏蔽字 */



6.chmod和fchmod函數

這兩個函數使我們可以更改現有文件的訪問權限:

#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編程是非常重要的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章