`
xitong
  • 浏览: 6188649 次
文章分类
社区版块
存档分类
最新评论

Linux 32和64位平台下支持LFS

 
阅读更多

在Linux x86(32位)系统上编译的程序放到Linux x86_64(64位)系统上运行的时候出现调用lstat或lstat函数的错误,返回的错误码值为75,错误描述为“Value too large for defined data type”。

为了让程序能够使用LFS(大文件系统),你可以选择使用下面的方法:使用gcc -D_FILE_OFFSET_BITS=64重新编译程序,这会强制都使用64位版本的系统调用来访问所有的文件。这也将改变几种数据类型,例如:off_t变为off64_t,stat变为stat64_t。因此,总是使用正确的数据类型而不使用例如int替代off_t是非常重要的。为了满足其它平台下的可移植性,你应该使用getconf LFS_CFLGAS获取编译选项。在Linux平台上它会返回-D_FILE_OFFSET_BITS=64选项,但也可能返回_EFILE_SOURCE和_LARGFILE64_SOURCE。使用这些定义,你可以直接使用LFS函数,例如open64,lstat64,fstat64,creat64等。使用O_LARGEFILE标志打开文件,对LFS进行操作。运行info libc “Feature Test Macros”可以得到特征测试宏的完整文档说明。

备注:在<sys/types.h>中有如下的宏定义。

#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
# define __USE_FILE_OFFSET64 1
#endif

补充说明:

在程序中使用stat,fstat和lstat函数检查文件的属性。他们在stat结构中返回属性的信息(stat结构)。所有三个函数在<sys/stat.h>头文件中声明。

函数:int stat(const char * filename, struct stat *buf)

stat函数在指向buf的stat结构中返回关于filename文件属性的信息。如果filename是符号链接,你获得的描述文件的属性就是链接所指向文件的属性。如果链接指向一个不存在的文件,那么stat调用失败,并且报告一个不存在的文件。

如果操作成功那么返回值为0,失败则返回-1。除了通常的文件名错误外,还定义有如下的errno出错条件。

ENOENT filename命名的文件不存在。

当源代码使用_FILE_OFFSET_BITS==64进行编译时,该函数实际上就是stat64,因为使用LFS支持的接口替代普通的实现。

函数:int stat64(const char *filename, struct stat64 *buf)

此函数与stat类似,区别在于它能够在32位系统上处理大于2G的文件。为了达到这个目的,结果保存到一个struct stat64类型的变量buf上。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用stat为函数名时也有效,当然在32位机器上替代小文件的接口。

函数:fstat(int filedes, struct stat* buf)

fstat函数与stat类似,只是在打开文件时使用文件描述符替代文件名作为参数。像stat函数一样,fstat函数调用成功返回0,失败则返回-1.下面errno错误情况是针对fstat定义的。

EBADF filedes参数是一个无效的文件描述符;

如果使用_FILE_OFFSET_BITS==64来编译时,该函数实际上是fstat64,因此使用LFS文件支持的接口替代普通的实现。

函数:int fstat64(int filedes, struct stat64 * buf)

此函数与fstat类似,区别在于它能够在32位系统上处理大于2^31的文件。因为LFS的文件描述符一般使用open64或者creat64函数得到。Buf指针指向的变量类型为struct stat64,用来代表LFS。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用stat为函数名时也是有效的,当然在32位机器上替代下文件的接口。

函数:int lstat(const char *filename, struct stat *buf)

lstat函数与stat类似,区别在于lstat函数不跟随符号链接。如果flename参数是一个符号链接,lstat函数仅仅返回链接本身的信息,否则lstat和stat函数的作用是相同的。

如果使用_FILE_OFFSET_BITS==64来编译时,该函数实际上就是stat64,因此使用LFS支持的接口替代普通的实现。

函数:int lstat64(const char *filename, struct stat64 *buf)

此函数与stat类似,区别在于它能够在32为系统上处理大于2G大小的文件。为了达到这个目的,结果保存到一个struct stat64类型的buf变量中。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用lstat为函数名时也有效,当然在32为机器上替代小文件的接口。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics