2021-05-18

struct stat

{

 

    dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/

 

    ino_t       st_ino;     /* inode number -inode节点号*/

 

    mode_t      st_mode;    /* protection -保护模式?*/

 

    nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/

 

    uid_t       st_uid;     /* user ID of owner -user id*/

 

    gid_t       st_gid;     /* group ID of owner - group id*/

 

    dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/

 

    off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/

 

    blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/

 

    blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/

 

    time_t      st_atime;   /* time of last access -最近存取时间*/

 

    time_t      st_mtime;   /* time of last modification -最近修改时间*/

 

    time_t      st_ctime;   /* time of last status change - */

 

};

 

off_t类型用于指示文件的偏移量,常就是long类型,其默认为一个32位的整数,在gcc编译中会被编译为long int类型,在64位的Linux系统中则会被编译为long long int,这是一个64位的整数,其定义在unistd.h头文件中可以查看。

 

242 # ifndef __off_t_defined

243 #  ifndef __USE_FILE_OFFSET64

244 typedef __off_t off_t;

245 #  else

246 typedef __off64_t off_t;

247 #  endif

248 #  define __off_t_defined

249 # endif

250 # if defined __USE_LARGEFILE64 && !defined __off64_t_defined

251 typedef __off64_t off64_t;

252 #  define __off64_t_defined

253 # endif

 

原因:

在32 位的 Linux 上面写超过 2GB 的文件会发生错误,甚至导致程式终止执行。

这是因为 Linux  的系统内部处理文件时用的 off_t定义为 long,而 long 在 32 位的系统上的大小为 32 位,因此最大只能支援 2^31-1 = 2,147,483,647 bytes 等於是 2GB 扣掉 1 byte 的档案大小

64 位元的系统 (例如 AMD64 或 IA64) 则因为 long 定义成 64 位元,所以不会有问题..

# if __WORDSIZE == 64

typedef long int       int64_t;

# endif

不过在 FreeBSD 上面,即使是 32 位元的系统,也不会有 2GB 档案大小的限制,这是因为 FreeBSD 内部处理档案时,本来就是使用 64 位元的数字当作指标,所以不会有问题

 

 

解决方案:

编译时加后面参数

-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值