China Open source community
站内导航:

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

apache中的文件与目录(2)

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

olid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 72pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent" width=96>

0x00020
APR_BUFFERED
缓存数据,默认情况下不进行数据缓存
0x00040
APR_EXCL
return error if APR_CREATE and file exists
0x00080
APR_DELONCLOSE
关闭后删除该文件
0x00100
APR_XTHREAD
该标志依赖于具体的平台,用以确保文件在跨线程访问中的安全
0x00200
APR_SHARELOCK
平台依赖标记,用以支持上层的读写所访问从而支持跨进程或者跨机器访问
0x00400
APR_FILE_NOCLEANUP
通知系统不要在内池中注册文件清除函数,因此当内存池被销毁的时候,apr_file_t中的apr_os_file_t句柄将不会被销毁
0x00800
APR_SENDFILE_ENABLED 
Open with appropriate platform semantics
 for sendfile operations. Advisory only,           apr_socket_sendfile does not check this flag.
0x01000
perm则是用以记录文件的存取权限,通常情况下是一个整数,比如0x777,0x666等等。Apache中支持的权限如表4-3所示。
文件的读取结果由指针apr_file_t返回。整个open过程可以分为四部分:
1)、“打开标志位”转换;
如前所述,APR定义了自己的“文件打开标志位”,所以在apr_file_open的开始需要将这些专有的“文件打开标志位”转换为Unix平台通用的“文件打开标志位”,对应的转换表如下:
Apache打开标志
UNIX库函数内部标志
APR_READ&&APR_WRITE
O_RDWR
APR_READ
O_RDONLY
APR_WRITE
O_WRONLY
APR_CREATE
O_CREAT
O_CREAT&&APR_EXCL
O_CREAT&O_EXCL
APR_EXCL&&!APR_CREATE
允许组成员读取
APR_APPEND
O_APPEND
APR_TRUNCATE
O_TRUNC
O_BINARY
O_BINARY
APR_BUFFERED&&APR_XTHREAD
允许其余成员读取
2)、权限标志位”转换;
同1)理,专有的APR“权限标志位”需要转换为Unix平台通用的“权限标志位”;转换使用函数apr_unix_perms2mode实现,转换根据表4-2的对应关系实现。函数返回的权限最终传递给open函数的标志位。
(3)、调用Unix的本地API打开文件;
(4)、设置apr_file_t变量相关属性值;
APR 文件I/O封装支持非阻塞I/O带超时等待以及缓冲I/O,默认情况下为阻塞的,即BLK_ON。
APR文件的另外一个特殊之处就是支持缓冲特性。由于磁盘读取的速度瓶颈,使得频繁的从磁盘读取文件在一定程度上会影响执行效率,因此为了提高读取效率,APR支持文件的缓存读写,即开辟一块大的缓冲内存区,用以保存实际从磁盘中读取得数据,这样用户每次就不需要读写磁盘,而只要读写内存,通过这种缓冲策略,可以改善一定的性能。是否缓冲可通过“文件打开标志位APR_BUFFERED”设置。一旦设置为缓冲读写,则apr_file_open会在pool中开辟大小为APR_FILE_BUFSIZE(4096)的缓冲区供使用。
创建函数中一个比较重要的就是内存池中apr_file_t类型的清除函数注册。当内存池被销毁的时候,对于所有的apr_file_t类型将调用apr_unix_file_cleanup函数进行清除。与创建类似,清除也包括四方面的工作:
(1)、
(2)、关闭文件描述符filedes,如果文件的打开标志是APR_DELONCLOSE,那么在关闭之后还得将该文件删除;如果文件可能跨进程使用,那么还得销毁互斥锁。
(3)、
 
4.5 文件读取
4.5.1普通文件读取
文件的读写操作定义在readwrite.c中。函数的原型与标准的接口非常类似:
APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, apr_size_t *nbytes)
thefile是需要读取的文件的描述结构,而buf是文件读取保存的缓冲区。nbytes则是从文件中需要读取的字节数。Apache中的文件读取在内部分为两种机制:支持读写缓存的和不支持读写缓存的,读写是否需要支持缓存,有apr_file_t内部的buffered成员决定,buffered=1表示内部必须支持缓存,否则不需要使用缓存。
我们首先分析最普通的内部不使用缓存的读写情况,下面是读取的核心代码:
{
    apr_ssiz

[1] [2] [3] [4] [5] [6] [7] [8] [9]

编辑 webmaster

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