国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Apache中的文件與目錄(1)

2019-11-17 04:50:18
字體:
來源:轉載
供稿:網友
4.1 文件概述
文件I/O在Unix下占據著非常重要的地位,曾有一句經典語句絕對可以說明file在Unix下的重要性, "In UNIX, everything is a file",APR就是本著這個思想對Unix文件I/O進行了再一次的抽象封裝,以提供更為強大和友善的文件I/O接口。
APR File I/O源代碼的位置在$(APR_HOME)/file_io目錄下針對不同類型的操作系統,file_io下又進一步細分為四個目錄:netware,os2,unix和win32。每個目錄中又包含多個.c文件,每個.c文件對應一種文件操作,比如
open.c -- 封裝了文件的打開、關閉、改名和刪除等操作
readwrite.c -- 顧名思義,它里面包含了文件的讀寫操作;
pipe.c -- 包含了pipe相關操作。
還有許多這里不多說,由于文件I/O操作復雜,我們下面將僅挑出最常用的文件I/O操作進行分析。
4.2 APR文件定義
正如第一章所言,APR中為了移植方便,通常會使用自定義的常量來代替原有系統中存在的常量,并提供它們之間的相互轉換,這一點對于文件也不例外。APR幾乎對文件中所用到的所有的常量都進行了重新定義,包括文件權限、文件打開方式、文件類型定義等等。這部分我們集中了解APR中的這些定義。在后面的部分將很快就會使用到。
4.2.1文件類型
盡管在Unix中,一切皆文件,但是文件又分為不同類型:
1)、普通文件(regular file)。這是最常見的文件類型。UNIX中使用S_IFREG描述該類文件,而APR中使用APR_REG描述。
2)、目錄文件(Directory file)。這種文件包含了其他文件的名字以及指向與這些文件有關信息的指針。UNIX中使用S_IFDIR描述,在APR中使用APR_DIR描述。
3)、字符非凡文件(character special file)。這類文件通常對應系統中某些類型的設備。UNIX中使用S_IFCHR描述,而APR中使用APR_CHR描述。
4)、塊非凡文件(block special file)。這類文件典型的用于磁盤設備。系統中的所有設備或者是字符非凡文件,或者是塊非凡文件。UNIX中使用S_IFBLK描述,而APR中使用APR_BLK描述該類文件。
5)、FIFO文件。這類文件通常用于進程間通信,有時也稱之為管道。APR中使用APR_PIPE描述該類文件。
6)、套接字描述文件。這類文件用于進程間的網絡通信。UNIX中使用S_IfsoCK描述,而APR中使用APR_SOCK描述該類文件。
7)、鏈接文件。最后一種文件類型就是鏈接文件。這種文件通常僅僅指向另外一個文件。UNIX中使用S_IFLNK描述,而APR中使用APR_LNK描述該類文件。
綜合上面的內容,APR定義了枚舉類型apr_filetype_e來描述所有的Unix文件類型。
typedef enum {
    APR_NOFILE = 0,     /**< no file type determined */
    APR_REG,            /**< a regular file */
    APR_DIR,            /**< a directory */
    APR_CHR,            /**< a character device */
    APR_BLK,            /**< a block device */
    APR_PIPE,           /**< a FIFO / pipe */
    APR_LNK,            /**< a symbolic link */
    APR_SOCK,           /**< a [unix domain] socket */
    APR_UNKFILE = 127   /**< a file of some other unknown type */
} apr_filetype_e;
為了實現APR定義和UNIX定義的轉換,APR中通過函數filetype_from_mode實現從系統定義到APR定義的轉換。該函數定義在filestat.c中:

static apr_filetype_e filetype_from_mode(mode_t mode)
{
    apr_filetype_e type;
    switch (mode & S_IFMT) {
    case S_IFREG:
        type = APR_REG; break;
    case S_IFDIR:
        type = APR_DIR; break;
    ……
    }
}
4.2.2文件訪問權限
在UNIX系統中,每一個文件都對應三組不同的訪問權限,即用戶存取權限、組用戶存取權限和其余用戶存取權限。在UNIX中,通常用S_IXXXX常量來描述這些訪問權限。APR中則使用APR_FPROT_XXXX來進行替代,對應的關系如下表所示:
權限標志
含義
標準庫值
APR_FPROT_USETID
答應設置用戶號
0x8000
S_ISUID
APR_FPROT_UREAD
答應用戶讀操作
0x0400
S_IRUSR
APR_FPROT_UWRITE
答應用戶寫操作
0x0200
S_IWUSR
APR_FPROT_UEXECUTE
答應用戶執行
0x0100
S_IXUSR
APR_FPROT_GSETID
用于設置組號
0x4000
S_ISGID
APR_FPROT_GREAD
答應組成員讀取
0x0040

S_IRGRP
APR_FPROT_GWRITE
答應組成員寫入
0x0020
S_IWGRP
APR_FPROT_GEXECUTE
答應組成員執行
0x0010
S_IXGRP
APR_FPROT_WSTICKY
粘貼位
0x2000
S_ISVTX
APR_FPROT_WREAD
答應其余成員讀取
0x0004
S_IROTH
APR_FPROT_WWRITE
答應其余成員寫入
0x0002
S_IWOTH
APR_FPROT_WEXECUTE 
答應其余成員執行.
0x0001
S_IXOTH
APR_FPROT_OS_DEFAULT
操作系統的默認的屬性值
0x0FFF
0666
在早期版本中,訪問權限使用的是APR_XXXX形式,比如APR_UREAD、APR_UWRITE等等。不過目前已經作廢。為了保持與低版本的兼容性,你在源文件中還能看到它們。
在APR中,文件的訪問權限被定義為apr_fileperms_t類型,該類型本質上是一個32位的整數而已:
typedef apr_int32_t               apr_fileperms_t;
APR中提供了兩個函數用于實現從APR權限標志到UNIX系統標志位的相互轉換。apr_unix_perms2mode函數用于將APR定義轉換為Unix定義,apr_unix_mode2perms用于將Unix定義轉換為APR定義。這兩個函數都定義在fileacc.c中。從Unix轉換至APR的過程無非如下:
    if (mode & S_IXXXX)
        perms = APR_XXXX;
而從APR轉換為Unix過程無非如下:

    if (perms & APR_XXXX)
        mode = S_IXXXX;
4.2.3文件打開方式
4.2.4其余類型重定義
 APR中除了對上面的常量進行了重定義之外,它還對一些類型進行了重定義,不過這些類型都僅僅是使用typedef而已,非常簡單,總結歸納如下:
1)、文件屬性類型apr_fileattrs_t
typedef apr_uint32_t               apr_fileattrs_t;
2)、文件定位基準apr_seek_where_t
typedef int                                apr_seek_where_t;
3)、文件訪問權限apr_fileperms_t
typedef apr_int32_t               apr_fileperms_t;
4)、文件i-node結點編號apr_ino_t
typedef ino_t                     apr_ino_t;
5)、文件所在設備號apr_dev_t
typedef dev_t                     apr_dev_t;
4.3 文件描述
在Unix系統中,與文件關聯的兩個數據結構通常是兩個:FILE和stat。前者通常稱之為文件句柄,而后者則通常稱之為文件的狀態信息,用于描述文件的內部信息。APR中,與之對應提供了兩個封裝數據結構apr_file_t和apr_finfo_t,前者描述文件句柄信息,后者描述文件內部信息。
根據操作系統支持的不同,apr_file_t了可以分為四個版本,不過我們僅僅介紹Unix版本,至于Window版本,我們會提及,而其余的netware和OS/2版本我們不打算做任何分析。在Unix系統中,apr_file_t定義如下:
strUCt apr_file_t {
    apr_pool_t *pool;
    int filedes;
    char *fname;
    apr_int32_t flags;
    int eof_hit;
    int is_pipe;
    apr_interval_time_t timeout;
    int buffered;
    enum {BLK_UNKNOWN, BLK_OFF, BLK_ON } blocking;
    int ungetchar;    /* Last char provided by an unget op. (-1 = no char)*/
#ifndef WAITIO_USES_POLL
    /* if there is a timeout set, then this pollset is used */
    apr_pollset_t *pollset;
#endif
    /* Stuff for buffered mode */
    char *buffer;

    int bufpos;               /* Read/Write position in buffer */
    unsigned long dataRead;   /* amount of valid data read into buffer */
    int direction;            /* buffer being used for 0 = read, 1 = write */
    unsigned long filePtr;    /* position in file of handle */
#if APR_HAS_THREADS
    struct apr_thread_mutex_t *thlock;
#endif
};
該結構描述了一個文件的大部分的屬性,也是整個文件I/O系統的核心數據結構之一。
filedes是文件的描述符;fname則是打開的文件的名稱;is_pipe用以標記當前文件是否是管道文件;Unix中在創建匿名管道的時候會生成一個管道文件,在管道中傳輸的數據實際上最終都保存在匿名文件中。對于這種臨時的管道文件,它的is_pipe為1;filePtr是讀寫文件的時候文件內部的文件指針,通常情況下這個成員只有seek函數的時候才需要使用,由于seek需要給出當前文件的內部指針位置,因此在任何的文件讀和寫之后,我們都必須立即調整filePtr的值,以使它指向正確的位置。direction則是記錄了當前的操作類型,0是讀操作,1是寫操作;buffer緩沖區用以保存從文件中讀取的數據,dataRead則用以記錄從文件中讀取到緩沖區中的有效的字節數;blocking則是記錄的讀取的方式,一般答應兩種,即阻塞和非阻塞。對于阻塞,那么讀取將等待,直到文件中有新的數據或者讀取超時,超時的時間由timeout決定。
另外,假如支持多線程,那么為了保證線程訪問安全性,在可能出現互斥的數據結構中都要額外的增加內部互斥鎖。文件結構的內部互斥鎖由變量thlock決定。任何人訪問該數據結構之前都必須先獲取該互斥鎖,同時訪問結束后該互斥鎖將被釋放。
關于作者
張中慶,目前主要的研究方向是嵌入式瀏覽器,移動中間件以及大規模服務器設計。目前正在進行Apache的源代碼分析,計劃出版《Apache源代碼全景分析》上下冊。Apache系列文章為本書的草案部分,對Apache感愛好的朋友可以通過flydish1234 at sina.com.cn與之聯系!

假如你覺得本文不錯,請點擊文后的“推薦本文”鏈接!!



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜南县| 鄯善县| 扶沟县| 清河县| 吴堡县| 余江县| 德安县| 普陀区| 府谷县| 河南省| 洛川县| 五大连池市| 外汇| 凤台县| 林州市| 瓮安县| 盐津县| 北碚区| 织金县| 庐江县| 南川市| 深泽县| 曲松县| 正阳县| 延寿县| 从化市| 桃园市| 永泰县| 邵阳县| 华池县| 且末县| 观塘区| 安阳市| 安平县| 宁武县| 宁安市| 西充县| 聂拉木县| 淄博市| 本溪| 九江县|