2

我在 AIX 上使用 statvfs 函数调用。并使用 GCC 编译器。我希望 statvfs 调用通过预处理器解析为 statvfs64。

例如:在 Solaris 中,使用带有 gcc 的“-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64”标志我被解析为 statvfs64。

您能否帮助在 AIX 上获取类似的标志,这将我从 statvfs 解析为 statvfs64。

谢谢和问候, Sivaram T

4

3 回答 3

2

非常感谢您的即时回复。不幸的是,在 AIX 包含文件上没有定义“_LARGEFILE64_SOURCE”。

我知道以下选项“-maix64 -mpowerpc64”可以解析到statvfs64。不确定这些是否正确使用。

请找到以下 sys/statvfs.h 文件

=================================================

#ifndef _H_STATVFS
#define _H_STATVFS

#ifndef _H_STANDARDS
#include <standards.h>
#endif

#if _XOPEN_SOURCE_EXTENDED==1

#include <strict_stdtypes.h>

#ifndef _H_TYPES
#include <sys/types.h>
#endif

#include <end_strict_stdtypes.h>

#define _FSTYPSIZ       16

#ifdef _ALL_SOURCE
#include <sys/vmount.h>

#define FSTYPSIZ        _FSTYPSIZ
#endif

/*
 * statvfs system call return structure
 */

struct statvfs {
    ulong_t    f_bsize;     /* preferred file system block size          */
    ulong_t    f_frsize;    /* fundamental file system block size        */
    fsblkcnt_t f_blocks;    /* total # of blocks of f_frsize in fs       */
    fsblkcnt_t f_bfree;     /* total # of free blocks                    */
    fsblkcnt_t f_bavail;    /* # of blocks available to non super user   */
    fsfilcnt_t f_files;     /* total # of file nodes (inode in JFS)      */
    fsfilcnt_t f_ffree;     /* total # of free file nodes                */
    fsfilcnt_t f_favail;    /* # of nodes available to non super user    */
#ifdef _ALL_SOURCE
    fsid_t     f_fsid;      /* file system id                            */
#else
    ulong_t    f_fsid;      /* file system id                            */
#ifndef __64BIT__
    ulong_t    f_fstype;    /* file system type                          */
#endif
#endif  /* _ALL_SOURCE */
    char       f_basetype[_FSTYPSIZ]; /* Filesystem type name (eg. jfs)  */
    ulong_t    f_flag;      /* bit mask of flags                         */
    ulong_t    f_namemax;   /* maximum filename length                   */
    char       f_fstr[32];  /* filesystem-specific string */
    ulong_t    f_filler[16];/* reserved for future use                   */
};

#define ST_NOSUID       0x0040          /* don't maintain SUID capability    */

#define ST_RDONLY       0x0001          /* file system mounted read only     */
#define ST_NODEV        0x0080          /* don't allow device access across  */
                                    /* this mount                        */

/*
 * Prototypes
 */
#ifdef _NO_PROTO
extern int statvfs();
extern int fstatvfs();
#else
extern int statvfs(const char *__restrict__, struct statvfs *__restrict__);
extern int fstatvfs(int, struct statvfs *);
#endif

/*
 * statvfs64 system call return structure
 */
#ifdef _ALL_SOURCE

struct statvfs64 {
    blksize64_t f_bsize;    /* preferred file system block size          */
    blksize64_t f_frsize;   /* fundamental file system block size        */
    blkcnt64_t f_blocks;    /* total # of blocks of f_frsize in fs       */
    blkcnt64_t f_bfree;     /* total # of free blocks                    */
    blkcnt64_t f_bavail;    /* # of blocks available to non super user   */
    blkcnt64_t f_files;     /* total # of file nodes (inode in JFS)      */
    blkcnt64_t f_ffree;     /* total # of free file nodes                */
    blkcnt64_t f_favail;    /* # of nodes available to non super user    */
    fsid64_t   f_fsid;      /* file system id                            */
    char       f_basetype[FSTYPSIZ]; /* Filesystem type name (eg. jfs)  */
    ulong_t    f_flag;      /* bit mask of flags                         */
    ulong_t    f_namemax;   /* maximum filename length                   */
    char       f_fstr[32];  /* filesystem-specific string */
    ulong_t    f_filler[16];/* reserved for future use                   */
};

/*
 * Prototypes
 */
#ifdef _NO_PROTO
extern int statvfs64();
extern int fstatvfs64();
#else
extern int statvfs64(const char *__restrict__, struct statvfs64 *__restrict__);
extern int fstatvfs64(int, struct statvfs64 *);
#endif

#endif  /* _ALL_SOURCE */

#endif /* _XOPEN_SOURCE_EXTENDED */
#endif /* _H_STATVFS */

=================================================

于 2010-01-19T15:23:41.343 回答
0

iirc 在 AIX 上您需要 _LARGE_FILES 令牌集,这将启用隐式大文件支持。

-D_LARGE_FILES 

如果你想显式调用 statvfs64 ,你必须这样做

-D_LARGE_FILE_API
于 2010-01-19T14:34:23.303 回答
0

我没有 AIX 系统,所以我不能告诉你要设置的标志。但是,在 Solaris 上,您可以查看sys/statvfs.h并了解它是如何工作的,例如搜索statvfs64并查找它周围的#ifdef 块。你会看到线条

#if defined(_LARGEFILE64_SOURCE)
    typedef struct statvfs64 {
    .....
    } statvfs64_t;
#endif

#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
...
#define statvfs_t               statvfs64_t
#define statvfs                 statvfs64
#define fstatvfs                fstatvfs64
#endif

您将能够在 AIX 上执行完全相同的操作。但是,AIX 可能表现不同,并且不使用预处理器在 32 位和 64 位版本之间切换。

如果对你来说不是很明显,那么你可以把上面的内容贴在sys/statvfs.h这里,我们可以帮你看看。

于 2010-01-19T13:57:49.207 回答