China Open source community
站内导航:

 
 
 
当前位置: 首页 >> 应用软件 >> 网络相关 >> Apache中的文件与目录(1)
 

Apache中的文件与目录(1)

作者:张中庆flydish1234 at sina.com.cn      来源:     发表时间:2006-03-06     浏览次数:      字号:    

hite; PADDING-BOTTOM: 0cm; WIDTH: 140.35pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt" width=187>

允许组成员读取
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_UREADAPR_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系统中,与文件关联的两个数据结构通常是两个:FILEstat。前者通常称之为文件句柄,而后者则通常称之为文件的状态信息,用于描述文件的内部信息。APR中,与之对应提供了两个封装数据结构apr_file_tapr_finfo_t,前者描述文件句柄信息,后者描述文件内部信息。
根据操作系统支持的不同,apr_file_t了可以分为四个版本,不过我们仅仅介绍Unix版本,至于Window版本,我们会提及,而其余的netwareOS/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_pipe1filePtr是读写文件的时候文件内部的文件指针,通常情况下这个成员只有seek函数的时候才需要使用,由于seek需要给出当前文件的内部指针位置,因此在任何的文件读和写之后,我们都必须立即调整filePtr的值,以使它指向正确的位置。direction则是记录了当前的操作类型,0是读操作,1是写操作;buffer缓冲区用以保存从文件中读取的数据,dataRead则用以记录从文件中读取到缓冲区中的有效的字节数;blocking则是记录的读取的方式,一般允许两种,即阻塞和非阻塞。对于阻塞,那么读取将等待,直到文件中有新的数据或者读取超时,超时的时间由timeout决定。
另外,如果支持多线程,那么为了保证线程访问安全性,在可能出现互斥的数据结构中都要额外的增加内部互斥锁。文件结构的内部互斥锁由变量thlock决定。任何人访问该数据结构之前都必须先获取该互斥锁,同时访问结束后该互斥锁将被释放。
关于作者
张中庆,目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计。目前正在进行Apache的源代码分析,计划出版《Apache源代码全景分析》上下册。Apache系列文章为本书的草案部分,对Apache感兴趣的朋友可以通过flydish1234 at sina.com.cn与之联系!

[1] [2] [3] [4] [5]

编辑 webmaster

 
 
 
评论
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - WWW.YUANMA.ORG - 中国开放源代码社区