Как определить макрос _FILE_OFFSET_BITS и _LARGE_FILES для Solaris и HP-AIX

У меня есть программа C, как показано ниже. Я не знаю, что использовать stat64 вместо stat как в Solaris, так и в HP-AIX. Я хочу создать эту программу как на 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.

но я не знаю, как определить этот макрос в приведенной выше программе, чтобы он успешно работал на обеих ОС.

Пожалуйста, предложите несколько идей.


person Community    schedule 23.02.2016    source источник
comment
Где вы определили UNIX или NT_OS?   -  person SKD    schedule 23.02.2016
comment
IME, самый простой подход — скомпилировать приложение как 64-битное. Флаги LARGE_FILES/etc предназначены только для 32-битных приложений. В противном случае IIRC stat64() должен быть всегда доступен вместе с обычным stat(): они существуют специально для облегчения 64-битного интерфейса для 32-битных приложений.   -  person Dummy00001    schedule 23.02.2016
comment
Вы можете использовать опцию -D для определения макроса при компиляции. Я также предлагаю проверить это. stackoverflow.com/ вопросы/4357570/   -  person Umamahesh P    schedule 23.02.2016
comment
@ Dummy00001 - Просто обратите внимание, что 64-битная структура FILE в Solaris полностью непрозрачна, поэтому код, который зависит от доступа к конкретной реализации FILE, необходимо будет исправить. Несколько ссылок на соответствующую документацию: google.com/search ?q=solaris+64-bit+FILE+is+opaque   -  person Andrew Henle    schedule 23.02.2016
comment
HP-AIX — это сокращение от HP-UX и AIX?   -  person Jdamian    schedule 21.06.2016


Ответы (3)


Подробные данные для доступа к большим файлам, включая компиляцию больших файлов, ссылки и другие флаги, можно найти для Solaris на странице lfcompile справочная страница:

lfcompile

  • среда компиляции больших файлов для 32-битных приложений

Описание

Все 64-битные приложения по умолчанию могут работать с большими файлами. Методы, описанные на этой странице, позволяют 32-разрядным приложениям манипулировать большими файлами.

...

Обратите внимание, что на странице руководства специально указано, что необходимы определения, отличные от возвращаемых через getconf:

Установите флаг времени компиляции _FILE_OFFSET_BITS на 64, прежде чем включать какие-либо заголовки. Приложения могут комбинировать объекты, созданные в среде компиляции больших файлов, с объектами, созданными в переходной среде компиляции, но должны соблюдать осторожность в отношении взаимодействия между этими объектами. Приложения не должны объявлять глобальные переменные типов, размеры которых меняются в разных средах компиляции.

вместе с

Приложения, желающие получить доступ к fseeko() и ftello(), а также к интерфейсам, соответствующим спецификациям POSIX и X/Open, должны определить макрос _LARGEFILE_SOURCE равным 1 и установить любые макросы тестирования функций, подходящие для получения желаемой среды (см. стандарты (5). )).

Подробности смотрите в разделе примеров на справочной странице.

person Andrew Henle    schedule 23.02.2016

Точные имена и значения этих #define зависят от реализации. К счастью, команда оболочки getconf будет рассказать вам, что это такое, когда вы передаете ему параметр LFS_CFLAGS. Затем вы можете передать их в командной строке при компиляции.

gcc `getconf LFS_CFLAGS` -o program program.c
person dbush    schedule 23.02.2016

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

person Like    schedule 28.07.2021