快捷搜索:

Apache APR可移植运行库简介(4)

转载请注明滥觞:http://blog.csdn.net/tingya

1.5.3差错处置惩罚

大年夜型的系统法度榜样的差错处置惩罚是十分紧张的,APR作为一个通用库接口聚拢具体的阐清楚明了应用APR时若何进行差错处置惩罚。

1.5.3.1 差错码定义

差错处置惩罚的第一步便是定义返回码,包括“差错码和状态码分类”。APR的函数大年夜部分都返回int类型作为返回码的,不过为了更明确易懂,APR在apr_errno.h中应用typedef int apr_status_t将其进行了从新定义。它在一路定义的还有apr所用的所有差错码和状态码。假如一个APR函数绝对的弗成能掉足,那么此时就容许不返回ap_status_t差错码,只必要返回void类型即可。不过APR中大年夜部分的函数都是返回apr_status_t值。

APR中的返回码的定义并不是随意的,没有规则的。相反,APR给出了定义返回码的严格的规定。APR中根据返复书息的相似性将它们分为七大年夜类,分手定义如下所示:

#define APR_OS_ERRSPACE_SIZE50000

#define APR_SUCCESS0

#define APR_OS_START_ERROR20000

#define APR_OS_START_STATUS(APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE)

#define APR_OS_START_USERERR(APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE)

#define APR_OS_START_CANONERR (APR_OS_START_USERERR \

+ (APR_OS_ERRSPACE_SIZE * 10))

#define APR_OS_START_EAIERR(APR_OS_START_CANONERR + APR_OS_ERRSPACE_SIZE)

#define APR_OS_START_SYSERR(APR_OS_START_EAIERR + APR_OS_ERRSPACE_SIZE)

正常环境下,函数返回APR_SUCCESS作为成功标志。否则根据环境返回上述种别中的任一种。每一大年夜类的返复书息又可以详细细分为实际的值。在Apache中,每一类返复书息所容许的数目由APR_OS_ERRSPACE_SIZE抉择,今朝为50000,APR_OS_CANONERR为500000。另一方面,APR_OS_START_ERROR、APR_OS_START_STATUS、APR_OS_START_USEERR、APR_OS_START_CANONERR、APR_OS_START_EAIERR和APR_OS_START_SYSERR,它们每个都拥有自己独自的偏移量,详细偏移量的值以及含义如下表描述:

差错名称 含义

0 每个平台都有0,然则都没有实际的定义,0又切实着实是一个errno value的offset,然则它是“匿名的”,它不像EEXIST那样有着可以“自描述”的名字。

APR_OS_START_ERROR 该定义是平台相关的,不合平台的值可能不合,它定义了APR中所容许的差错码的肇端偏移量,即20000,这意味着所有的差错码值不能低于20000。至于差错码,它可所以导致APR函数掉败的任何缘故原由。在这个范围内定义的所有差错码形式都必须是APR_E*款式,比如APR_ENOSTAT、APR_ENOSOCKET、APR_ENOPOOL。该种别中容许定义最多50000种差错码。

APR_OS_START_STATUS 该定义也是平台相关的,它定义了APR中所容许的返回状态值的肇端偏移量,即APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE,即70000开始。不过必要留意的是,状态值并不能表示掉败照样成功。假如要表示返回成功,必须应用APR_SUCCESS返回。在这个范围的状态码形式都必须是APR_*款式,比如APR_DETACH、APR_INCHILD。

APR_OS_START_USERERR

APR_OS_START_USEERR 该定义也是平台相关的。当用户应用APR库的时刻,假如它盼望定义APR返回码之外的另外的自定义返回码,那么这些返回码必须从APR_OS_START_USEERR开始,即APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE,即从120000开始。

APR_OS_START_CANONERR APR_OS_START_CANONERR is where APR versions of errno values are defined on systems which don't have the corresponding errno.对付这类返回码的定义平日如下:

#ifdef EEXIST

#define APR_EEXIST EEXIST

#else

#define APR_EEXIST(APR_OS_START_CANONERR + 2)

#endif

APR_OS_START_EAIERR 在应用socket编程的时刻假如调用getaddrinfo()函数,该函数会返回一系列的以EAI_*开始的差错码,比如EAI_AGAIN,EAI_FAIL等等。这些不规则的差错码终极都要转换为APR中对应的返回码。这些转换码从APR_OS_START_EAIERR开始,最多容许50000个(当然事实上肯定没有这么多)。

APR_OS_START_SYSERR 因为APR必须维持跨平台的特点,是以不合的操作系统平台肯定有自己所独占的一些返回码,这些返回码不具有移植性,是与平台相关的。只管如斯,他们也必须转换为APR内部返回码。APR_OS_START_SYSERR指定了定义这些不具有移植性返回码的肇端偏移,为720000,容量为50000。

各返复书息肇端便移量及其差别可以用下图描述:

从上表可以看出,所有的APR定义的返回码都是从APR_OS_START_ERROR开始,那么0到APR_OS_START_ERROR之间将近20000个空位岂不是挥霍了?事实上这部分空间并没有挥霍。我们后面所描述的”native error”会占用这部分的闲暇。

Apache中的返回码如下表所示:

差错名称 含义 值

APR_ENOSTAT APR无法对一个文件履行stat操作 20001

APR_ENOPOOL APR没有供给内存池来履行内存分配操作 20002

APR_EBADDATE APR给出了一个无效的日期 20003

APR_EINVALSOCK APR给出了一个无效的socket 20004

APR_ENOPROC APR没有给定一个进程的布局 20005

APR_ENOTIME APR没有给定一个光阴布局 20006

APR_ENODIR APR没有给定一个目录布局 20007

APR_ENOLOCK APR没有给定一个互斥锁布局 20008

APR_ENOPOLL APR没有给定一个Poll布局 20009

APR_ENOSOCKET APR没有给定一个socket 20010

APR_ENOTHREAD APR没有给定一个线程布局 20011

APR_ENOTHDKEY APR没有给定一个线程Key布局 20012

APR_ENOSHMAVAIL APR中没有更多的可用共享内存 20013

APR_EDSOOPEN APR中无法打开一个DSO工具 20014

APR_EGENERAL APR中的平日的差错 20015

APR_EBADIP 描述的IP地址差错 20016

APR_EBADMASK 描述的IP地址掩码差错 20017

APR_ESYMNOTFOUND 无法查找到哀求symbo 20018

APR_INCHILD 法度榜样正在履行子进程 70001

APR_INPARENT 法度榜样正在履行父进程 70002

APR_DETACH 线程从主线程中被分离出来 70003

APR_NOTDETACH 线程尚未从主线程平分离出来 70004

APR_CHILD_DONE 子进程已经履行完毕 70005

APR_CHILD_NOTDONE 子进程尚未履行完毕 70006

APR_TIMEUP 履行操作超时 70007

APR_INCOMPLETE The operation was incomplete although some processing was performed and the results are partially valid 70008

APR_BADCH Getopt函数查找到一个不在选项字符串中的选项 70012

APR_BADARG Getopt发明一个选项缺少参数,而在选项字符串中该选项必须指定 70013

APR_EOF APR已经到达文件的末端 70014

APR_NOTFOUND APR在poll布局中无法发明socket 70015

APR_ANONYMOUS APR正在应用匿名的共享内存 70019

APR_FILEBASED APR正在应用文件名作为共享内存的key 70020

APR_KEYBASED APR正在应用共享key作为共享内存的key 70021

APR_EINIT70022

APR_ENOTIMPL 在该平台上,该APR函数尚未实现 70023

APR_EMISMATCH 输入的两个密码不匹配 70024

APR_EABSOLUTE 给定的路径值是绝对路径 70019

APR_ERELATIVE 给定的路径是相对路径 70020

APR_EINCOMPLETE 给定的路径既不是相对路径也不是绝对路径 70021

APR_EABOVEROOT 给定的路径在跟路径上 70022

APR_EBUSY 给定的互斥锁正忙,已经被锁定 70025

APR_EPROC_UNKNOWN 该进程无法被APR所识别 70024

有一点必须明确的是返回码并不必然老是差错码。假如你的函数返回多个值,它们中的每一个都意味着履行成功,然则它们的值却不一样,或者你的函数仅仅返回成功或者掉败两种环境,那么APR中平日仍旧会返回一个apr_status_t值。

在第一种环境下,即假如履行成功具有多种状态,那么可以为每一个状态定义一个APR返回状态码,范例的例子便是apr_proc_wait函数,它用于等待子进程停止,它会返回三种环境:APR_CHILDDONE表示子进程已经履行完毕;APR_CHILDNOTDONE表示子进程尚未履行完毕;差错码则意味着等待子进程掉败。对付前两种返回不能称之为掉败,它们都是成功返回,只是返回状态不一样而已,为此APR中定义两个状态码表示返回状态,记着不是差错码。

对付第二种环境,即履行成功后仅有一种状态,那么假如履行成功,APR中平日返回APR_SUCCESS,而不是什么都不返回;假如履行掉败,则定义新的APR状态码来描述这种掉败。比如apr_compare_users函数,它返回APR_SUCCESS表示掉败,同时定义APR_EMISMATCH和另外差错码表示掉败。

根据上面的原则,你就会发明APR中的函数很少有返回类型为void或者void*的。更多的都是返回apr_status_t。

APR中所有的差错码的定义在apr_errno.h中都可以找到。当APR函数中发生差错的时刻,这些函数必须返回一个差错码。假如这些差错是在系统调用差错,那么APR将应用系统调用返回的差错码errno作为返回码原样返回,比如:

if(open(fname,oflags,0777)1.5.3.2 返回码信息映射

大年夜部分环境下,状态码主要用于系统内部应用,是以它的含义隐晦,对付用户影响不是特其余大年夜,然则差错码则不一样。用户更多的是盼望系统返回足够多的信息以便直到发生差错的缘故原由,从而进行跟踪和调试。是以这种环境下,假如假如仅仅返回一个整数给用户,用户可能会莫名其妙,一头雾水。最好的措施便是能够将该返回码所代表的实际的含义以字符串的形式返回出去。事实上大年夜部分操作系统平台都供给了这种对应函数,比如stderror。APR中应用apr_strerror函数将上述的返回码转换为实际的字符串信息:

APR_DECLARE(char *) apr_strerror(apr_status_t statcode, char *buf,

apr_size_t bufsize)

statcode是必要转换的返回码,转换后的字符串保存在缓冲区buf中,函数所容许的字符串的长度由bufsize节制。

对付不合的返回码,APR采取不合的转换策略:

■ 系统差错码(statcode1.5.3.3 差错捕捉策略

对付APR自定义差错码,APR可以直接经由过程返回值获取,而对付系统调用差错码,Apache则必须应用系统函数来获取。对付所有的操作系统平台,Apache供给了四个函数捕获系统相关差错码:

apr_get_os_error()

apr_set_os_error(e)

apr_get_netos_error()

apr_set_netos_error(e)

前两个分手用于或者和设置系统差错码,而后者则主要用于获取和设置收集差错码,之以是进行这种区分,是由于大年夜部分操作系统平台上获取系统差错码和获取收集差错码的措施不合。在Window平台上获取差错码主如果调用函数GetLastError和SetLastError,对付收集差错的获取则是WSAGetLastError和WSASetLastError。Unix下则与之不合。下表列出了各个平台对应的处置惩罚:

apr_get_os_error apr_set_os_error(e) apr_get_netos_error apr_set_netos_error(e)

Window GetLastError SetLastError(e) WSAGetLastError WSASetLastError

Unix (errno) (errno = (e)) (errno) (errno = (e))

Netware (errno) (errno = (e)) WSAGetLastError WSASetLastError

Apache中大年夜部分的操作都是将返回码与指定的返回码进行对照,然后根据对照结果做出进一步的操作。不过Apache中对付差错码的对照并不是应用最简单的款式,比如“if(s==APR_EBUSY)”,取而代之的是,Apache中应用一些简单的宏来履行对照义务,平日款式为:

APR_STATUS_IS_XXX

XXX平日是差错码APR_XXX的XXX部分,比如APR_STATUS_IS_EOF、APR_STATUS_IS_BADCH等等。而这些宏的实现异常简单,一看就明白:

#define APR_STATUS_IS_BADCH(s)((s) == APR_BADCH)

APR_errno.h中的大年夜部分内容便是这种宏定义,每一个差错码都邑对应这样一个宏定义。

别的系统中还定义了两个宏分手用于实现APR返回码与操作系统本地码的转换:

#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)

#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)

前者用于将操作系统平台相关的返回码转换为APR定义的返回码,而后者则相反,用于将APR定义的返回码转换为操作系统平台相关码。

因为APR是可移植的,这样就可能碰到这样一个问题:不合平台差错码的不同等。若何处置惩罚呢?APR给我们供给了2种策略:

a)对付所有的操作系统平台都返回相同的差错码

这种策略的毛病是从平台相关差错码转换为通用差错码对照消费光阴,而且大年夜多半环境下,开拓职员必要的仅仅是输出一个差错字符串而已。假如我们将所有的差错码转换为一个通用的公共的差错码子集,那么为了输出一个差错字符串信息,我们必须完成四个步骤:

make syscall that fails

convert to common error codestep 1

return common error code

check for success

call error output functionstep 2

convert back to system errorstep 3

output error stringstep 4

比拟而言,这是一个对照耗时的步骤。经由过程应用应用平台相关差错码的话,那么全部步骤可以压缩为只有两步:

make syscall that fails

return error code

check for success

call error output functionstep 1

output error stringstep 2

这种策略的第二个可能造成的问题便是差错码的损耗,这种问题源自各个平台差错码数目的不均衡性。比如Windows和OS/2操作系统定义了成百上千差错码,而POSIX才定义了50差错码,假如都转换为规范统一的差错码,势必会有Window平台差错码含义的损掉(差错码多的比如Window平台),或者可能得不到拥有真正含义的差错码(差错码少的,比如POSIX)。

b) 返回平台相关差错码,假如必要将它转换为APR通用差错码

第二种策略中,法度榜样的履行路线每每要根据函数返回差错码来定,这么做的毛病便是把这些事情推给了法度榜样员。履行流程如:

make syscall that fails

convert to common error code

return common error code

decide execution based on common error code

假如斟酌到将平台相关的差错码转换为通用的差错码,那么上面的代码段可以改动为如下:

make syscall that fails

return error code

convert to common error code (using ap_canonical_error)

decide execution based on common error code

1.5.4宏处置惩罚

Apache今朝能够支持五个大年夜种类的运行平台,包括Window、OS/2、BeOS、Unix、NetWare,而Window又可以细分为Window98、Window2000等等。Unix则又可以进一步细分,包括Linux,ScoUNIX,DARWIN等等。为了能够让Apache运行在如斯之多的操作系统平台上,Apache在源代码中增添了许多的编译开关。

举个例子,比如utime.h头文件的包孕问题。由于文件在Linux(gcc)下面和Windows(cl)下所处的C Library目录不合。包孕的处置惩罚法子就不一样。可能必要这样写才能完全精确的包孕。

#if HAVE_UTIME_H//---- 假如有utime.h 文件

#ifdef WIN32//-----假如是win32情况

#include//-----包孕sys/utime.h

#endif

#ifdef LINUX//---- 假如是Linux情况

#include//---- 包孕utime.h

#endif

#else//--- 假如没有utime.h定义出必要的布局

struct utimbuf

{

long actime;

long modtime;

};

#endif

Apache处置惩罚与之类似。根据编译情况的不合来编译不合的代码。 这样的#define的区隔,主要便是为了区隔不合平台的不合细微差别。有的差别大概是某些常量没有定义,有些差别是某些函数不存在。

Apache中应用的很多的编译开关是各个操作系统或者各个编译器已经确定的,经由过程这些预定义就可以很轻易的区分应用的操作系统平台,比如__osf__和__alpha是DEC的OSF/1 1.3操作系统中的定义,是以假如某个函数只能运行于OSF/1 1.3中,则可以应用下面的编译处置惩罚代码:

#ifdefine __osf__||__aplpa

//调用函数

#endif

下面的表格中给出了今朝大年夜部分的操作系统以及编译器的编译开关:

机械硬件临盆商操作系统编译器能够识别的编译其开关变量

AMIGACommodoreAMIGA-OS (AMIGADOS)GNUamiga or AMIGA, __GNUC__, maybe MC68000 or AMIGA3000

anyanyUNIXGNUunix, __GNUC__, ...

anyanyUNIXCCunix, ...

Amiga 3000CommodoreAmiga UNIX 2.1 SVR4.0GNUunix,__unix__,AMIX,__AMIX__,__svr4__,m68k, __m68k__, __motorola__, __GNUC__

SUN-3SunSUN-OS3 (UNIX BSD 4.2)GNUsun, unix, mc68020, __GNUC__

SUN-3SunSUN-OS4 (UNIX SUNOS 4.1)GNUsun, unix, mc68020, __GNUC__

SUN-386SunSUN-OS4 (UNIX SUNOS 4.0)GNUsun, unix, sun386, i386, __GNUC__

SUN-386SunSUN-OS4 (UNIX SUNOS 4.0)CCsun, unix, sun386, i386

SUN-4SunSUN-OS4 (UNIX SUNOS 4.1)GNUsun, unix, sparc, __GNUC__

SUN-4SunSUN-OS4 (UNIX SUNOS 4.1)CCsun, unix, sparc

SUN-4SunSUN-OS5 (UNIX Solaris)GCCsun, unix, sparc, __GNUC__

UltraSparcSunSolaris 7 (UNIX SUNOS 5.7)CCsun, unix, __sparc, __sparcv9

UltraSparcSunSolaris 7 (UNIX SUNOS 5.7)GCCsun, unix, __sparc, __arch64__, __GNUC__

IBM-PC/386anySUN-OS5 (UNIX Solaris)GCCsun, unix, __svr4__, i386, __GNUC__

HP9000-300Hewlett-PackardNetBSD 0.9 (UNIX BSD 4.3)GNUunix, __NetBSD__, mc68000, __GNUC__

HP9000-300Hewlett-PackardHP-UX 8.0 (UNIX SYS V)GNU[__]hpux, [__]unix, [__]hp9000s300, mc68000, __GNUC__

HP9000-800Hewlett-PackardHP-UX 8.0 (UNIX SYS V)GNU[__]hpux, [__]unix, [__]hp9000s800

IRISSilicon GraphicsIRIX (UNIX SYS V 3.2)GNUunix, SVR3, mips, sgi, __GNUC__

IRISSilicon GraphicsIRIX (UNIX SYS V)cc -ansi[__]unix, [__]SVR3, [__]mips, [__]sgi

IRISSilicon GraphicsIRIX 5 (UNIX SYS V 4)GNU[__]unix, [__]SYSTYPE_SVR4, [__]mips, [__]host_mips, [__]MIPSEB, [__]sgi, _

DSO__, [__]_MODERN_C, __GNUC__

DECstation 5000RISC/OS (Ultrix V4.2A)GNUunix, [__]mips, [__]ultrix

DG-UX 88kData GeneralDG/UXGNUunix, m88000, DGUX

DEC AlphaDECOSF/1 1.3cc[unix,] __unix__, __osf__, __alpha

DEC AlphaDECOSF/1 1.3GNUunix, __unix__, __osf__, __alpha, __alpha__, _LONGLONG

Apple MacIIAppleA/UX (UNIX SYS V 2)GNU[__]unix, [__]AUX, [__]macII, [__]m68k, mc68020, mc68881, __GNUC__

NeXTNeXTNeXTstep 3.1 (UNIX)ccNeXT, m68k; NEXTAPP for NeXTstep Application

PowerPCAppleMach 3.0 + MkLinuxGNUunix, __powerpc__, __PPC__, _ARCH_PPC, _CALL_SYSV, __ELF__, __linux__

PowerPCAppleMach + Rhapsodycc__MACH__, __APPLE__, __ppc[__], __GNUC__, __APPLE_CC__

PowerPCAppleMach + MacOS Xcc__MACH__, __APPLE__, __ppc__, __GNUC__, __APPLE_CC__

SequentSequentPTX 3.2.0 V2.1.0 i386 (SYS V) GNUunix, i386, _SEQUENT_, __GNUC__

SequentSequentPTX V4.1.3GNUunix, i386, _SEQUENT_, __svr4__, __GNUC__

Convex C2ConvexConvexOS 10.1GNU__convex__, __GNUC__

IBM RS/6000IBMAIX 3.2GNU_AIX, _AIX32, _IBMR2, __CHAR_UNSIGNED__, __GNUC__

IBM-PC/386anyLINUX (free UNIX)GNUunix, linux, i386, __GNUC__

IBM-PC/386anyLINUX (free UNIX)Intel 5.0__unix__, __linux__, __INTEL_COMPILER, __ICC, __USLC__

IBM-PC/386any386BSD 0.1 (UNIX BSD 4.2)GNUunix, __386BSD__, i386, __GNUC__

IBM-PC/386anyNetBSD 0.9 (UNIX BSD 4.3)GNUunix, __NetBSD__, i386, __GNUC__

IBM-PC/386anyFreeBSD 4.0 (UNIX BSD 4.4)GNUunix, __FreeBSD__, i386, __GNUC__

IBM-PC/386anyEMX 0.9c (UNIXlike on OS/2)GNU[unix,] i386, __GNUC__, __EMX__

IBM-PC/386anyCygwin32 on WinNT/Win95GNU_WIN32, __WINNT__, __CYGWIN32__, __POSIX__, _X86_, i386, __GNUC__

IBM-PC/386anyMingw32 on WinNT/Win95GNU_WIN32, __WINNT__, __MINGW32__, _X86_, i386, __GNUC__

IBM-PC/386anyWinNT/Win95MSVC4.0,5.0_WIN32, _M_IX86, _MSC_VER

IBM-PC/386anyWinNT/Win95Borland 5.0__WIN32__, _M_IX86, __TURBOC__, __BORLANDC__

IBM-PC/386anyWinNT/Win95 and Cygwin32GNU_WIN32, __WINNT__, __CYGWIN32__, __POSIX__, __i386__, _X86_, __GNUC__

IBM-PC/586anyBeOS 5GNU__BEOS__, __INTEL__, __i386__, _X86_, __GNUC__

IBM-PC/586anyHP NUE/ski, LinuxGNUunix, linux, __ia64[__], __GNUC__, __LP64__

RM400Siemens-NixdorfSINIX-N 5.42c89unix, mips, MIPSEB, host_mips, sinix, SNI, _XPG_IV

AcornRisc PCRISC OS 3.xGNU[__]arm, [__]riscos, __GNUC__

AcornRisc PCRISC OS 3.xNorcroft[__]arm, [__]riscos

APPLE IIGSApple????

当然,列出上面的大年夜部分的编译开关,并不是说Apache都支持它们,事实上Apache仅仅支持一部分,假如仅仅对某个操作系统或者某个机械有兴趣,则可以遴选对应的宏定义中的代码。

上述的编译器开拓都是某个平台相关的,事实上只要运行于该平台,该开关自然就成立,不必要APR本身从新定义。别的有一些特点开关则是必须由APR自行定义。这些特点平日是操作系统之间很小的差别,比犹如样是Unix系统,可能有的支持共享内存,有的不支持,为此在应用共享内存之前必须能够判断当前的平台是否支持。这些特点宏的定义可以从apr.h.in模板中定义:

#define APR_HAVE_ARPA_INET_H@arpa_ineth@

#define APR_HAVE_CONIO_H

#define APR_HAVE_CRYPT_H

#define APR_HAVE_CTYPE_H

#define APR_HAVE_DIRENT_H

#define APR_HAVE_ERRNO_H

#define APR_HAVE_FCNTL_H

#define APR_HAVE_IO_H

#define APR_HAVE_LIMITS_H

#define APR_HAVE_NETDB_H

#define APR_HAVE_NETINET_IN_H@netinet_inh@

#define APR_HAVE_NETINET_SCTP_H @netinet_sctph@

#define APR_HAVE_NETINET_SCTP_UIO_H @netinet_sctp_uioh@

#define APR_HAVE_NETINET_TCP_H@netinet_tcph@

#define APR_HAVE_PTHREAD_H

#define APR_HAVE_SEMAPHORE_H

#define APR_HAVE_SIGNAL_H

#define APR_HAVE_STDARG_H

#define APR_HAVE_STDINT_H

#define APR_HAVE_STDIO_H

#define APR_HAVE_STDLIB_H

#define APR_HAVE_STRING_H

#define APR_HAVE_STRINGS_H

#define APR_HAVE_SYS_IOCTL_H@sys_ioctlh@

#define APR_HAVE_SYS_SENDFILE_H @sys_sendfileh@

#define APR_HAVE_SYS_SIGNAL_H@sys_signalh@

#define APR_HAVE_SYS_SOCKET_H@sys_socketh@

#define APR_HAVE_SYS_SOCKIO_H@sys_sockioh@

#define APR_HAVE_SYS_SYSLIMITS_H @sys_syslimitsh@

#define APR_HAVE_SYS_TIME_H@sys_timeh@

#define APR_HAVE_SYS_TYPES_H@sys_typesh@

#define APR_HAVE_SYS_UIO_H@sys_uioh@

#define APR_HAVE_SYS_UN_H@sys_unh@

#define APR_HAVE_SYS_WAIT_H@sys_waith@

#define APR_HAVE_TIME_H

#define APR_HAVE_UNISTD_H

#define APR_HAVE_SHMEM_MMAP_TMP

#define APR_HAVE_SHMEM_MMAP_SHM

#define APR_HAVE_SHMEM_MMAP_ZERO

#define APR_HAVE_SHMEM_SHMGET_ANON

#define APR_HAVE_SHMEM_SHMGET

#define APR_HAVE_SHMEM_MMAP_ANON

#define APR_HAVE_SHMEM_BEOS

#define APR_USE_SHMEM_MMAP_TMP

#define APR_USE_SHMEM_MMAP_SHM

#define APR_USE_SHMEM_MMAP_ZERO

#define APR_USE_SHMEM_SHMGET_ANON

#define APR_USE_SHMEM_SHMGET

#define APR_USE_SHMEM_MMAP_ANON

#define APR_USE_SHMEM_BEOS#define APR_USE_FLOCK_SERIALIZE

#define APR_USE_SYSVSEM_SERIALIZE

#define APR_USE_POSIXSEM_SERIALIZE

#define APR_USE_FCNTL_SERIALIZE

#defineAPR_USE_PROC_PTHREAD_SERIALIZE

#define APR_USE_PTHREAD_SERIALIZE

#define APR_HAS_FLOCK_SERIALIZE

#define APR_HAS_SYSVSEM_SERIALIZE

#define APR_HAS_POSIXSEM_SERIALIZE

#define APR_HAS_FCNTL_SERIALIZE

#define APR_HAS_PROC_PTHREAD_SERIALIZE

#define APR_HAS_RWLOCK_SERIALIZE

#define APR_PROCESS_LOCK_IS_GLOBAL

#define APR_HAVE_CORKABLE_TCP@have_corkable_tcp@

#define APR_HAVE_GETRLIMIT@have_getrlimit@

#define APR_HAVE_IN_ADDR@have_in_addr@

#define APR_HAVE_INET_ADDR@have_inet_addr@

#define APR_HAVE_INET_NETWORK@have_inet_network@

#define APR_HAVE_IPV6@have_ipv6@

#define APR_HAVE_MEMMOVE@have_memmove@

#define APR_HAVE_SETRLIMIT@have_setrlimit@

#define APR_HAVE_SIGACTION@have_sigaction@

#define APR_HAVE_SIGSUSPEND@have_sigsuspend@

#define APR_HAVE_SIGWAIT@have_sigwait@

#define APR_HAVE_STRCASECMP@have_strcasecmp@

#define APR_HAVE_STRDUP@have_strdup@

#define APR_HAVE_STRICMP@have_stricmp@

#define APR_HAVE_STRNCASECMP@have_strncasecmp@

#define APR_HAVE_STRNICMP@have_strnicmp@

#define APR_HAVE_STRSTR@have_strstr@

#define APR_HAVE_MEMCHR@have_memchr@

#define APR_HAVE_STRUCT_RLIMIT @struct_rlimit@

#define APR_HAVE_UNION_SEMUN@have_union_semun@

#define APR_HAVE_SCTP@have_sctp@

/* APR Feature Macros */

#define APR_HAS_SHARED_MEMORY

#define APR_HAS_THREADS

#define APR_HAS_SENDFILE

#define APR_HAS_MMAP

#define APR_HAS_FORK

#define APR_HAS_RANDOM

#define APR_HAS_OTHER_CHILD

#define APR_HAS_DSO

#define APR_HAS_SO_ACCEPTFILTER

#define APR_HAS_UNICODE_FS0

#define APR_HAS_PROC_INVOKED0

#define APR_HAS_USER1

#define APR_HAS_LARGE_FILES0

#define APR_HAS_XTHREAD_FILES0

#define APR_HAS_OS_UUID0

在应用configure进行设置设置设备摆设摆设的时刻,apr.h.in模板作为输入最毕天生apr.h文件。不过apr.h.in中的将被0或者1所取代:假如该平台支持某个特定,响应的宏将定义为1,否则定义为0。

关于作者

张中庆,今朝主要的钻研偏向是嵌入式浏览器,移动中心件以及大年夜规模办事器设计。今朝正在进行Apache的源代码阐发,计划出版《Apache源代码全景阐发》高低册。Apache系列文章为本书的草案部分,对Apache感兴趣的同伙可以经由过程flydish1234 at sina.com.cn与之联系!

您可能还会对下面的文章感兴趣: