自己手寫實現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 符號鏈接的那個實例就可以看出來了。