【发布时间】: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 宏。
但我不知道如何在上面的程序中定义这个宏才能在两个操作系统上成功运行。
请提出一些想法。
【问题讨论】:
-
您在哪里定义了
UNIX或NT_OS? -
IME,最简单的方法是将应用程序编译为 64 位。 “LARGE_FILES”/etc 标志仅适用于 32 位应用程序。否则,IIRC
stat64()应该始终与普通的stat()一起可用:它们的存在专门用于促进 32 位应用程序的 64 位接口。 -
编译时可以使用-D选项定义宏。我也建议检查一下。 stackoverflow.com/questions/4357570/…
-
@Dummy00001 - 请注意,Solaris 上的 64 位
FILE结构是完全不透明的,因此需要修复依赖于访问特定FILE实现的代码。一些相关文档的链接:google.com/search?q=solaris+64-bit+FILE+is+opaque -
HP-AIX是“HP-UX 和 AIX”的缩写?