我有一个C程序如下。 我不知道在Solaris和Solaris中使用stat64而不是stat的内容。 HP-AIX。 我想在Solaris和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
宏。
但我不知道如何在上述程序中定义此宏,以便在两个操作系统上成功运行。
请提出一些建议。
答案 0 :(得分:2)
可以在lfcompile
man page上找到有关访问大型文件的详细数据,包括大型文件编译,链接和其他标志:
lfcompile
- 32位应用程序的大型文件编译环境
描述的
默认情况下,所有64位应用程序都可以操作大文件。该 此页面上描述的方法允许32位应用程序进行操作 大文件。
...
请注意,手册页明确指出除了通过getconf
返回的定义之外的定义是必要的:
在包含任何标头之前,将编译时标志_FILE_OFFSET_BITS设置为64。应用程序可以将在大型文件编译环境中生成的对象与在过渡编译环境中生成的对象组合在一起,但在这些对象之间的互操作性方面必须要小心。应用程序不应声明编译环境之间大小发生变化的类型的全局变量。
与
一起希望访问fseeko()和ftello()以及符合POSIX和X / Open规范的接口的应用程序应将宏_LARGEFILE_SOURCE定义为1,并设置适合的任何特征测试宏以获得所需的环境(请参阅标准(5))。
有关详细信息,请参见手册页的示例部分。
答案 1 :(得分:1)
这些#define
的确切名称和值是依赖于实现的。幸运的是,getconf
shell命令会告诉您在传递LFS_CFLAGS
参数时它们是什么。然后,您可以在编译时在命令行上传入它们。
gcc `getconf LFS_CFLAGS` -o program program.c
答案 2 :(得分:0)
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGE_FILES
对 AIX 有效 >= 5.1
另见:https://www.ibm.com/docs/en/aix/7.1?topic=volumes-writing-programs-that-access-large-files