st_size仅是一个文件的属性
st_blksize*st_blocks的大小相当于Windows下占用磁盘的大小
创建一个5G大小的文件
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char**argv){
if(argc<2){
fprintf(stderr,"Usage ...\n");
exit(1);
}
int fd = open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0600);
if(fd <0){
perror("open");
exit(1);
}
lseek(fd,5*1024*1024*1024-1,SEEK_SET);
write(fd,"",1);
close(fd);
exit(0);
}
结果:明显只有1G大小
是由于:整数溢出,代码中:5*1024*1024*1024-1没有带单位,导致linux默认为int类型大小,最大也是2^31-1,所以,应进行类型转换
(off_t)5*1024*1024*1024-1
或者5LL*1024LL*1024LL*1024LL-1LL