linux命令ls -l的total是怎么計算出來的?


自己手寫實現ls -l命令糾結了很久的地方,剛才總算搞明白了。直接上代碼重要部分

long nTotalBlocks = 0;
DIR* dp = opendir(dirPathName);
struct dirent* dirp;
while ((dirp = readdir(dp)) != NULL) {
	lstat(fullPath, &sbuf);
	long nBlocks = sbuf.st_size / 4096;
	if (sbuf.st_size % 4096 > 0)
		nBlocks++;
	if (S_ISLNK(sbuf.st_mode))
		nBlocks = 0;
	nTotalBlocks += nBlocks;
}
closedir(dp);
cout << "total " << nTotalBlocks * 4 << endl;

4096是塊的默認大小,由於total的單位是k(1024),所以后面還要再乘以4。

total其實就是所有文件所占的塊的大小總和,由於文件大小並不一定都是標准的4096的倍數,比如某文件大小為10000,就需要占用10000/4096+1=3個塊,占用塊的大小就是3*4096,以k為單位就是3*4096/1024=12。

網上很多人說得都不錯,但是漏掉了一個關鍵部分,那就是ls -l是不計算符號鏈接的,因為符號連接的st_size表示的是符號鏈接所指地址的長度,仔細一看,APUEv3中文版P97的4.17 符號鏈接的那個實例就可以看出來了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM