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
编辑 webmaster








