APUE學習筆記-第四章-文件和目錄

第四章 文件和目錄

1、函數stat、fstat、fstatat和lstat

#include<sys/stat.h>
Intstat(const char *restrict pathname,struct stat *restrict buf);
Intfstat(int fd,struct stat *buf);
Intlstat(const char *restrict pathname,struct stat *restrict buf);
Intfstatat(int fd,const char *restrict pathname,struct stat *restrict buf,intflag);
返回值:若成功,返回0;若出錯,返回-1。

stat函數能根據pathname得到以此name命名的文件的信息結構。

lstat能夠根據pathname得到以此name命名的連接文件的信息結構。lstat列出的是符號連接文件本身,而不是連接引用的文件。用途:需要以降序遍歷目錄層次結構時。

fstatat根據文件描述符得到相應文件的信息結構。

fstatat函數操作的函數爲:由fd參數指向的相對於當前打開目錄的路徑名,返回文件統計信息。

struct stat {
   dev_t        st_dev;       //文件的設備編號
   ino_t        st_ino;       //節點
   mode_t       st_mode;      //文件的類型和存取的權限
   nlink_t       st_nlink;    //連到該文件的硬連接數目,剛建立的文件值爲1
   uid_t        st_uid;       //用戶ID
   gid_t        st_gid;       //組ID
   dev_t        st_rdev;      //(設備類型)若此文件爲設備文件,則爲其設備編號
   off_t        st_size;      //文件字節數(文件大小)
    unsigned long st_blksize;   //塊大小(文件系統的I/O 緩衝區大小)
    unsigned long st_blocks;   //塊數
   time_t       st_atime;     //最後一次訪問時間
    time_t       st_mtime;     //最後一次修改時間
   time_t       st_ctime;     //最後一次改變時間(指屬性)
};

 

2、函數access和faccessat

    按實際用戶ID和實際組ID進行訪問測試訪問能力。

#include<unistd.h>
Int access(const char *pathname,intmode);
Int faccessat(int fd, const char*pathname,int mode,int flag);
返回值:若成功,返回0,若失敗,返回-1.

    兩個函數在下面兩種情況下是相同的:一種是pathname參數爲絕對路徑,另一種是fd參數取值爲AT_FDCWD而pathname參數爲絕對路徑;否則faccessat計算相對於打開目錄的pathname。

 

3、函數umask

    函數umask爲進程設置文件模式創建屏蔽字,並返回之前的值。

#include<sys/stat.h>
mode_tumask(mode_t mode);
返回值:之前的文件模式創建屏蔽字。

    在文件模式創建屏蔽字中爲1的位,在文件mode中的相應位一定被關閉。

示例:umask(0001);禁止其他執行;

 

4、函數chmod、fchmod和fchmodat

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

#include<sys/stat.h>
Int chmod(constchar *pathname,mode_t mode);
Int fchmod(intfd,mode_t mode);
Int fchmodat(intfd,const char *pathname,mode_t mode,int flag);
返回值:若成功,返回0;若出錯,返回-1.

    函數chmod在指定的文件上進行操作,fchmod函數則對已打開的文件進行操作;fchmodat與chmod函數類似(絕對/相對路徑名)

宏定義

說明

S_ISUID

04000

設置用戶權限

S_ISGID

02000

設置組用戶權限

S_ISVTX

01000

設置sticky位

S_IRUSR

00400

文件所有者的讀權限

S_IWUSR

00200

文件所有者的寫權限

S_IXUSR

00100

文件所有者的執行權限或目錄搜索權限

S_IRGRP

00040

組用戶的讀權限

S_IWGRP

00020

組用戶的寫權限

S_IXGRP

00010

組用戶的執行權限或目錄搜索權限

S_IROTH

00004

其他用戶的讀權限

S_IWOTH

00002

其他用戶的寫權限

S_IXOTH

00001

其他用戶的執行權限和目錄搜索權限

示例:chmod( path, 0700) ;

5、函數chown、fchown、fchownat和lchown

    下面幾個函數可用於更改文件的用戶ID和組ID。如果兩個參數owner或group中的任意一個是-1,則對應的ID不變。

#include<unistd.h>
Int chown(const char*pathname,uid_t owner,gid_t group);
Int fchown(int fd,uid_towner,gid_t group);
Int fchownat(int fd,const char*pathname,uid_t owner,gid_t group,int flag);
Int lchown(const char*pathname,uid_t owner,gid_t group);
返回值:若成功,返回0;若出錯,返回-1.

    除了所引用的文件是符號鏈接以外,這四個函數的操作類似。在符號鏈接情況下,lchown和fchownat更改符號連接本身的所有者,而不是該符號鏈接所指向的文件的所有者。

 

6、文件系統

https://blog.csdn.net/men_wen/article/details/52972678

    傳統的UNIX系統V文件系統,可以將一個硬盤分爲多個分區,每個分區可以包含一個文件系統

i節點是固定長度的記錄項,包含有關文件的信息。

 


7、函數link、linkat、unlink、unlinkat和remove

    任何一個文件可以有多個目錄項指向其i節點。創建一個指向現有文件的連接的方法是使用link函數或linkat函數。

#include<unistd.h>
Intlink(const char *existingpath,const char *newpath);
Int linkat(intfd,const char *existingpath,int nfd,const char *newpath,int flag);
兩個函數返回值:若成功,返回0;若出錯,返回-1.

這兩個函數創建一個新目錄項,它引用現有文件existingpath

    爲了刪除一個現有的目錄項,可以調用unlink函數。

#include<unistd.h>
Int unlink(constchar *pathname);
Int unlinkat(intfd,const char *pathname,int flag);
兩個函數返回值:若成功,返回0;若出錯,返回-1.

    這兩個函數刪除目錄項,並將有pathname所引用文件的鏈接計數減1.只有當鏈接計數達到0時,該文件的內容纔可被刪除。

    也可以用remove函數解除對一個文件或目錄的鏈接,對於文件,其功能與unlink相同,對於目錄,其功能與rmdir相同

#include<stdio.h>
Int remove(constchar* pathname);

 

8、函數rename和renameat

    文件或目錄可以用rename或者renameat函數進行重命名。

#include<stdio.h>
Int rename(constchar *oldname,const char *newname);
Int renameat(intoldfd,const char *oldname,int newfd,const char *newname);
兩個函數返回值:若成功,返回0;若失敗,返回-1

 

9、函數mkdir、mkdirat和rmdir

    用mkdir和mkdirat函數創建目錄,用rmdir刪除目錄。

#include<sys/stat.h>
Int mkdir(constchar *pathname,mode_t mode);
Int mkdirat(intfd,const char *pathname,mode_t mode);
兩個函數返回值:若成功,返回0;若出錯,返回-1.
#include<unistd.h>
Int rmdir(constchar *pathname);
返回值:若成功,返回0;若出錯,返回-1.

 

10、函數chdir、fchdir和getcwd

    進程調用chdir或fchdir函數可以更改當前工作目錄。

#include<unistd.h>
Int chdir(constchar *pathname);
Int fchdir(intfd);
兩個函數返回值:若成功,返回0;若出錯,返回-1.

    在兩個函數中,分別用pathname或打開文件描述符來指定新的當前工作目錄。

示例:chdir(“/tmp”);

    函數getcwd可以得到當前工作目錄完成的絕對路徑名。

#include<unistd.h>
char *getcwd(char*buf,size_t size);
返回值:若成功,返回buf;若出錯,返回NULL。

    兩個參數,一個是緩衝區地址buf,另一個是緩衝區長度。


https://blog.csdn.net/men_wen/article/details/52972678

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