如何为 Solaris 和 HP-AIX 定义 _FILE_OFFSET_BITS 和 _LARGE_FILES 宏

Posted

技术标签:

【中文标题】如何为 Solaris 和 HP-AIX 定义 _FILE_OFFSET_BITS 和 _LARGE_FILES 宏【英文标题】:How to define _FILE_OFFSET_BITS & _LARGE_FILES macro for Solaris and HP-AIX 【发布时间】:2016-06-05 04:25:28 【问题描述】:

我有一个如下的 C 程序。 在 Solaris 和 HP-AIX 中,我不使用 stat64 而不是 stat。 我想在 Solaris 和 HP-AIX 上构建这个程序。

#include "zunx.h"
#include <nls.h>

/*
 * NAME:        zunx_file_exists
 *
 * PURPOSE:     Checks if a file exists.
 *
 * INVOCATION:  boolean zunx_file_exists(name)
 *              char *name;
 *
 * INPUTS:      name    - file to check
 *
 * OUTPUTS:     TRUE or FALSE
 *
 * DESCRIPTION: zunx_file_exists does a stat on the specified file,
 *              and returns TRUE if a stat is found.  No check is
 *              made to determine what type of file it is.
 */
boolean zunx_file_exists
   (const char *buf)


#if defined(UNIX)
   struct stat fstat;

   if (buf != NULL && stat(I2E1(buf), &fstat) == 0)
      return TRUE;
   else
      return FALSE;
#endif

#ifdef NT_OS
   struct _stat64 fstat;

   if (buf != NULL && _stat64((char *) I2E1(buf), &fstat) == 0)
      return TRUE;
   else
      return FALSE;
#endif

我在 Solaris 中遇到了一个宏,例如:

 #ifdef UNIX
    #define _FILE_OFFSET_BITS 64
 #endif

这个定义对上述程序是否正确?

对于 HP-AIX,使用 _LARGE_FILES 宏。

但我不知道如何在上面的程序中定义这个宏才能在两个操作系统上成功运行。

请提出一些想法。

【问题讨论】:

您在哪里定义了UNIXNT_OS IME,最简单的方法是将应用程序编译为 64 位。 “LARGE_FILES”/etc 标志仅适用于 32 位应用程序。否则,IIRC stat64() 应该始终与普通的 stat() 一起可用:它们的存在专门用于促进 32 位应用程序的 64 位接口。 编译时可以使用-D选项定义宏。我也建议检查一下。 ***.com/questions/4357570/… @Dummy00001 - 请注意,Solaris 上的 64 位 FILE 结构是完全不透明的,因此需要修复依赖于访问特定 FILE 实现的代码。一些相关文档的链接:google.com/search?q=solaris+64-bit+FILE+is+opaque HP-AIX 是“HP-UX 和 AIX”的缩写? 【参考方案1】:

有关访问大文件的详细数据,包括大文件编译、链接和其他标志,可以在lfcompile man page 上找到 Solaris:

lfcompile

32 位应用程序的大文件编译环境

说明

默认情况下,所有 64 位应用程序都可以处理大文件。这 本页描述的方法允许 32 位应用程序操作 大文件。

...

请注意,手册页明确指出除了通过 getconf 返回的定义之外的定义是必需的:

在包含任何标头之前,将编译时标志 _FILE_OFFSET_BITS 设置为 64。应用程序可以将在大文件编译环境中产生的对象与在过渡编译环境中产生的对象结合起来,但必须注意这些对象之间的互操作性。应用程序不应声明其大小在编译环境之间发生变化的类型的全局变量。

随着

希望访问 fseeko() 和 ftello() 以及符合 POSIX 和 X/Open 规范的接口的应用程序应将宏 _LARGEFILE_SOURCE 定义为 1 并设置适合于获得所需环境的任何功能测试宏(请参阅标准(5))。

有关详细信息,请参阅手册页的示例部分。

【讨论】:

【参考方案2】:

这些#define 的确切名称和值取决于实现。幸运的是,getconf shell 命令会在您将LFS_CFLAGS 参数传递给它时告诉您这些是什么。然后,您可以在编译时在命令行中传递它们。

gcc `getconf LFS_CFLAGS` -o program program.c

【讨论】:

【参考方案3】:

Linux/Solaris/HP-UX

-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE

AIX

-D_LARGE_FILES

对 AIX 有效 >= 5.1

另请参阅:https://www.ibm.com/docs/en/aix/7.1?topic=volumes-writing-programs-that-access-large-files

【讨论】:

以上是关于如何为 Solaris 和 HP-AIX 定义 _FILE_OFFSET_BITS 和 _LARGE_FILES 宏的主要内容,如果未能解决你的问题,请参考以下文章

如何为复杂对象编写自定义 JSON 解码器?

如何为所有 scss 文件定义 sass 变量

如何为自定义类重载`float()`?

如何为自定义类的参数指定类型提示? [复制]

如何为函数本身设置 repr? [复制]

如何为wordpress主题添加自定义页眉和页脚