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