寫本篇文章的目的很簡單,防止采坑、防止采坑、防止采坑
我們在開發(fā)程序的過程中,往往需要預(yù)分配磁盤空間,防止因磁盤空間不夠而引發(fā)程序異常問題(已踩過坑), 現(xiàn)網(wǎng)查閱資料,有些預(yù)分配磁盤空間的方法不正確,在這里特別記錄一下, 除此之外,把正確的預(yù)分配的方法和大家分享一下,如果其他人有建議,歡迎拍磚狠砸
創(chuàng)新互聯(lián)建站是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)網(wǎng)站建設(shè)公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨特的設(shè)計風(fēng)格。自公司成立以來曾獨立設(shè)計制作的站點上千多家。
#include
#include
#include
#include
#include
#include
#include
uint64_t file_size = 10*1024*1024*1024ULL;
int main()
{
int fd = -1;
fd = open("test.data.fruncate.txt", O_RDWR | O_CREAT, 0666);
if(fd < 0){
printf("open failed\n");
return -1;
}
if(ftruncate(fd, file_size)){
printf("ftruncate error\n");
return -1;
}
lseek(fd, file_size - 1,SEEK_CUR);
write(fd, "1", 1);
close(fd);
return 0;
}
測試結(jié)果
#include
#include
int main()
{
FILE *f = fopen("test.data", "w");
fseek(f, 256*1024*1024 - 1, SEEK_CUR);
fputc(0,f);
return 0;
}
dd if=/dev/zero of=test bs=1M count=0 seek=1024
測試結(jié)果
1 .ls顯示文件的“邏輯上”的size, 這不是文件真正占用磁盤空間大小,這部分空間也會被其他進程使用。
2 .du顯示文件“物理上”的size,即du顯示的size是文件在硬盤上占據(jù)了多少個block計算出來的
請求tlinux內(nèi)核大神后,原來還存在fallocate 和 posix_fallocate這樣的函數(shù), 還是自己太low, 其實fallocate 和 posix_fallocate兩個最大的區(qū)別:
This is a nonportable, Linux-specific system call
廢話也不多說, 還是直接上代碼比較好一點, 一目了然
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include
#include
#include
#include
#include
#include
#include
uint64_t file_size = 10*1024*1024*1024ULL;
//int fallocate(int fd, int mode, off_t offset, off_t len);
//int posix_fallocate(int fd, off_t offset, off_t len);
int main()
{
int fd = -1;
int ret = -1;
fd = open("tmp.txt", O_CREAT|O_RDWR, 0666);
if(fd < 0){
printf("fd < 0");
return -1;
}
//ret = fallocate(fd, 0, 0, file_size);
ret = posix_fallocate(fd, 0, file_size);
if(ret < 0 ){
printf("ret = %d, errno = %d, %s\n", ret, errno, strerror(errno));
return -1;
}
printf("fallocate create %.2fG file\n", file_size/1024/1024/1024.0);
close(fd);
return 0;
}
測試結(jié)果:
root@xxx.xxx.xxx.xxx:/data6#time ./posix_fallocate
fallocate create 10.00G file
real 0m0.014s
user 0m0.000s
sys 0m0.014s
root@xxx.xxx.xxx.xxx:/data6#ll -h posix_fallocate.file.txt
-rw-r--r-- 1 root root 10G Oct 25 15:45 posix_fallocate.file.txt
root@xxx.xxx.xxx.xxx:/data6#du -sh posix_fallocate.file.txt
11G posix_fallocate.file.txt
不僅可以占住空間,而且速度非??欤?之前有過一個愚蠢的想法, 用dd命令直接創(chuàng)建10G文件,但是會造成IO毛刺,肯定不能這么玩,要是創(chuàng)造100G文件豈不是涼涼了。dd命令還是安安靜靜壓測下磁盤性能或者創(chuàng)造一些小文件比較好。
ret = -1, errno = 95, Operation not supported
root@xxx.xxx.xxx.xxx:/data6#fallocate -l 10G 2.txt
root@xxx.xxx.xxx.xxx:/data6#ll -h 2.txt
-rw-r--r-- 1 root root 10G Oct 25 15:33 2.txt
root@xxx.xxx.xxx.xxx:/data6#du -sh 2.txt
11G 2.txt