查看: 6427|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2008-8-17 01:13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
了2种策略:
a)对于所有的操作系统平台都返回相同的错误码
这种策略的缺点是从平台相关错误码转换为通用错误码比较耗费时间,而且大多数情况下,开发人员需要的仅仅是输出一个错误字符串而已。如果我们将所有的错误码转换为一个通用的公共的错误码子集,那么为了输出一个错误字符串信息,我们必须完成四个步骤:
    make syscall that fails
        convert to common error code                 step 1
        return common error code
            check for success
            call error output function               step 2
                convert back to system error         step 3
                output error string                  step 4
相比而言,这是一个比较耗时的步骤。通过使用使用平台相关错误码的话,那么整个步骤可以压缩为只有两步:
    make syscall that fails
        return error code
            check for success
            call error output function               step 1
                output error string                  step 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>    //-----包含sys/utime.h
#    endif
#    ifdef LINUX                   //---- 如果是Linux环境
#        include <utime.h>        //---- 包含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
下面的表格中给出了目前大部分的操作系统以及编译器的编译开关:
机器硬件     生产商            操作系统                     编译器         能够识别的编译其开关变量
AMIGA        Commodore          AMIGA-OS (AMIGADOS)           GNU           amiga or AMIGA, __GNUC__, maybe MC68000 or AMIGA3000
any          any                UNIX                          GNU           unix, __GNUC__, ...
any          any                UNIX                          CC            unix, ...
Amiga 3000   Commodore          Amiga UNIX 2.1 SVR4.0         GNU           unix,__unix__,AMIX,__AMIX__,__svr4__,m68k, __m68k__, __motorola__, __GNUC__
SUN-3        Sun                SUN-OS3 (UNIX BSD 4.2)        GNU           sun, unix, mc68020, __GNUC__
SUN-3        Sun                SUN-OS4 (UNIX SUNOS 4.1)      GNU           sun, unix, mc68020, __GNUC__
SUN-386      Sun                SUN-OS4 (UNIX SUNOS 4.0)      GNU           sun, unix, sun386, i386, __GNUC__
SUN-386      Sun                SUN-OS4 (UNIX SUNOS 4.0)      CC            sun, unix, sun386, i386
SUN-4        Sun                SUN-OS4 (UNIX SUNOS 4.1)      GNU           sun, unix, sparc, __GNUC__
SUN-4        Sun                SUN-OS4 (UNIX SUNOS 4.1)      CC            sun, unix, sparc
SUN-4        Sun                SUN-OS5 (UNIX Solaris)        GCC           sun, unix, sparc, __GNUC__
UltraSparc   Sun                Solaris 7 (UNIX SUNOS 5.7)    CC            sun, unix, __sparc, __sparcv9
UltraSparc   Sun                Solaris 7 (UNIX SUNOS 5.7)    GCC           sun, unix, __sparc, __arch64__, __GNUC__
IBM-PC/386   any                SUN-OS5 (UNIX Solaris)        GCC           sun, unix, __svr4__, i386, __GNUC__
HP9000-300   Hewlett-Packard    NetBSD 0.9 (UNIX BSD 4.3)     GNU           unix, __NetBSD__, mc68000, __GNUC__
HP9000-300   Hewlett-Packard    HP-UX 8.0 (UNIX SYS V)        GNU           [__]hpux, [__]unix, [__]hp9000s300, mc68000, __GNUC__
HP9000-800   Hewlett-Packard    HP-UX 8.0 (UNIX SYS V)        GNU           [__]hpux, [__]unix, [__]hp9000s800
IRIS         Silicon Graphics   IRIX (UNIX SYS V 3.2)         GNU           unix, SVR3, mips, sgi, __GNUC__
IRIS         Silicon Graphics   IRIX (UNIX SYS V)             cc -ansi      [__]unix, [__]SVR3, [__]mips, [__]sgi
IRIS         Silicon Graphics   IRIX 5 (UNIX SYS V 4)         GNU           [__]unix, [__]SYSTYPE_SVR4, [__]mips, [__]host_mips, [__]MIPSEB, [__]sgi, _
DSO__, [__]_MODERN_C, __GNUC__
DECstation 5000                 RISC/OS (Ultrix V4.2A)        GNU           unix, [__]mips, [__]ultrix
DG-UX 88k    Data General       DG/UX                         GNU           unix, m88000, DGUX
DEC Alpha    DEC                OSF/1 1.3                     cc            [unix,] __unix__, __osf__, __alpha
DEC Alpha    DEC                OSF/1 1.3                     GNU           unix, __unix__, __osf__, __alpha, __alpha__, _LONGLONG
Apple MacII  Apple              A/UX (UNIX SYS V 2)           GNU           [__]unix, [__]AUX, [__]macII, [__]m68k, mc68020, mc68881, __GNUC__
NeXT         NeXT               NeXTstep 3.1 (UNIX)           cc            NeXT, m68k; NEXTAPP for NeXTstep Application
PowerPC      Apple              Mach 3.0 + MkLinux            GNU           unix, __powerpc__, __PPC__, _ARCH_PPC, _CALL_SYSV, __ELF__, __linux__
PowerPC      Apple              Mach + Rhapsody               cc            __MACH__, __APPLE__, __ppc[__], __GNUC__, __APPLE_CC__
PowerPC      Apple              Mach + MacOS X                cc            __MACH__, __APPLE__, __ppc__, __GNUC__, __APPLE_CC__
Sequent      Sequent            PTX 3.2.0 V2.1.0 i386 (SYS V) GNU           unix, i386, _SEQUENT_, __GNUC__
Sequent      Sequent            PTX V4.1.3                    GNU           unix, i386, _SEQUENT_, __svr4__, __GNUC__
Convex C2    Convex             ConvexOS 10.1                 GNU           __convex__, __GNUC__
IBM RS/6000  IBM                AIX 3.2                       GNU           _AIX, _AIX32, _IBMR2, __CHAR_UNSIGNED__, __GNUC__
IBM-PC/386   any                LINUX (free UNIX)             GNU           unix, linux, i386, __GNUC__
IBM-PC/386   any                LINUX (free UNIX)             Intel 5.0     __unix__, __linux__, __INTEL_COMPILER, __ICC, __USLC__
IBM-PC/386   any                386BSD 0.1 (UNIX BSD 4.2)     GNU           unix, __386BSD__, i386, __GNUC__
IBM-PC/386   any                NetBSD 0.9 (UNIX BSD 4.3)     GNU           unix, __NetBSD__, i386, __GNUC__
IBM-PC/386   any                FreeBSD 4.0 (UNIX BSD 4.4)    GNU           unix, __FreeBSD__, i386, __GNUC__
IBM-PC/386   any                EMX 0.9c (UNIXlike on OS/2)   GNU           [unix,] i386, __GNUC__, __EMX__
IBM-PC/386   any                Cygwin32 on WinNT/Win95       GNU           _WIN32, __WINNT__, __CYGWIN32__, __POSIX__, _X86_, i386, __GNUC__
IBM-PC/386   any                Mingw32 on WinNT/Win95        GNU           _WIN32, __WINNT__, __MINGW32__, _X86_, i386, __GNUC__
IBM-PC/386   any                WinNT/Win95                   MSVC4.0,5.0   _WIN32, _M_IX86, _MSC_VER
IBM-PC/386   any                WinNT/Win95                   Borland 5.0   __WIN32__, _M_IX86, __TURBOC__, __BORLANDC__
IBM-PC/386   any                WinNT/Win95 and Cygwin32      GNU           _WIN32, __WINNT__, __CYGWIN32__, __POSIX__, __i386__, _X86_, __GNUC__
IBM-PC/586   any                BeOS 5                        GNU           __BEOS__, __INTEL__, __i386__, _X86_, __GNUC__
IBM-PC/586   any                HP NUE/ski, Linux             GNU           unix, linux, __ia64[__], __GNUC__, __LP64__
RM400        Siemens-Nixdorf    SINIX-N 5.42                  c89           unix, mips, MIPSEB, host_mips, sinix, SNI, _XPG_IV
Acorn        Risc PC            RISC OS 3.x                   GNU           [__]arm, [__]riscos, __GNUC__
Acorn        Risc PC            RISC OS 3.x                   Norcroft      [__]arm, [__]riscos
APPLE IIGS   Apple              ??                            ??
当然,列出上面的大部分的编译开关,并不是说Apache都支持它们,事实上Apache仅仅支持一部分,如果仅仅对某个操作系统或者某个机器有兴趣,则可以挑选对应的宏定义中的代码。
上述的编译器开发都是某个平台相关的,事实上只要运行于该平台,该开关自然就成立,不需要APR本身重新定义。另外有一些特性开关则是必须由APR自行定义。这些特性通常是操作系统之间很小的区别,比如同样是Unix系统,可能有的支持共享内存,有的不支持,为此在使用共享内存之前必须能够判断当前的平台是否支持。这些特性宏的定义可以从apr.h.in模板中定义:
#define APR_HAVE_ARPA_INET_H     @arpa_ineth@
#define APR_HAVE_CONIO_H         @conioh@
#define APR_HAVE_CRYPT_H         @crypth@
#define APR_HAVE_CTYPE_H         @ctypeh@
#define APR_HAVE_DIRENT_H        @direnth@
#define APR_HAVE_ERRNO_H         @errnoh@
#define APR_HAVE_FCNTL_H         @fcntlh@
#define APR_HAVE_IO_H            @ioh@
#define APR_HAVE_LIMITS_H        @limitsh@
#define APR_HAVE_NETDB_H         @netdbh@
#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       @pthreadh@
#define APR_HAVE_SEMAPHORE_H     @semaphoreh@
#define APR_HAVE_SIGNAL_H        @signalh@
#define APR_HAVE_STDARG_H        @stdargh@
#define APR_HAVE_STDINT_H        @stdint@
#define APR_HAVE_STDIO_H         @stdioh@
#define APR_HAVE_STDLIB_H        @stdlibh@
#define APR_HAVE_STRING_H        @stringh@
#define APR_HAVE_STRINGS_H       @stringsh@
#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          @timeh@
#define APR_HAVE_UNISTD_H        @unistdh@
#define APR_HAVE_SHMEM_MMAP_TMP     @havemmaptmp@
#define APR_HAVE_SHMEM_MMAP_SHM     @havemmapshm@
#define APR_HAVE_SHMEM_MMAP_ZERO    @havemmapzero@
#define APR_HAVE_SHMEM_SHMGET_ANON @haveshmgetanon@
#define APR_HAVE_SHMEM_SHMGET       @haveshmget@
#define APR_HAVE_SHMEM_MMAP_ANON    @havemmapanon@
#define APR_HAVE_SHMEM_BEOS         @havebeosarea@
#define APR_USE_SHMEM_MMAP_TMP     @usemmaptmp@
#define APR_USE_SHMEM_MMAP_SHM     @usemmapshm@
#define APR_USE_SHMEM_MMAP_ZERO    @usemmapzero@
#define APR_USE_SHMEM_SHMGET_ANON @useshmgetanon@
#define APR_USE_SHMEM_SHMGET       @useshmget@
#define APR_USE_SHMEM_MMAP_ANON    @usemmapanon@
#define APR_USE_SHMEM_BEOS         @usebeosarea@ #define APR_USE_FLOCK_SERIALIZE           @flockser@
#define APR_USE_SYSVSEM_SERIALIZE         @sysvser@
#define APR_USE_POSIXSEM_SERIALIZE        @posixser@
#define APR_USE_FCNTL_SERIALIZE           @fcntlser@
#defineAPR_USE_PROC_PTHREAD_SERIALIZE @procpthreadser@
#define APR_USE_PTHREAD_SERIALIZE    @pthreadser@
#define APR_HAS_FLOCK_SERIALIZE           @hasflockser@
#define APR_HAS_SYSVSEM_SERIALIZE         @hassysvser@
#define APR_HAS_POSIXSEM_SERIALIZE        @hasposixser@
#define APR_HAS_FCNTL_SERIALIZE           @hasfcntlser@
#define APR_HAS_PROC_PTHREAD_SERIALIZE @hasprocpthreadser@
#define APR_HAS_RWLOCK_SERIALIZE      @hasrwlockser@
#define APR_PROCESS_LOCK_IS_GLOBAL @proclockglobal@
#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     @sharedmem@
#define APR_HAS_THREADS           @threads@
#define APR_HAS_SENDFILE          @sendfile@
#define APR_HAS_MMAP              @mmap@
#define APR_HAS_FORK              @fork@
#define APR_HAS_RANDOM            @rand@
#define APR_HAS_OTHER_CHILD       @oc@
#define APR_HAS_DSO               @aprdso@
#define APR_HAS_SO_ACCEPTFILTER   @acceptfilter@
#define APR_HAS_UNICODE_FS        0
#define APR_HAS_PROC_INVOKED      0
#define APR_HAS_USER              1
#define APR_HAS_LARGE_FILES       0
#define APR_HAS_XTHREAD_FILES     0
#define APR_HAS_OS_UUID           0

在使用configure进行配置的时候,apr.h.in模板作为输入最终生成apr.h文件。不过apr.h.in中的@xx@将被0或者1所取代:如果该平台支持某个特定,相应的宏将定义为1,否则定义为0。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表