【问题标题】:GCC option to get statvfs64获取 statvfs64 的 GCC 选项
【发布时间】:2011-01-06 19:44:39
【问题描述】:

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

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

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

感谢和问候, 西瓦拉姆T

【问题讨论】:

    标签: c gcc aix


    【解决方案1】:

    我没有 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的内容贴在这里,我们可以帮你看看。

    【讨论】:

      【解决方案2】:

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

      -D_LARGE_FILES 
      

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

      -D_LARGE_FILE_API
      

      【讨论】:

      • 您好,我尝试了“-D_LARGE_FILES”和“-D_LARGE_FILE_API”选项,但没有成功。
      【解决方案3】:

      非常感谢您的即时回复。 不幸的是,在 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 */
      

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

      【讨论】:

      • 如果它解决了您的问题,请接受此答案。具有讽刺意味的是,我通过搜索类似的东西而不是通过标志找到了这个:)
      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多