首页 > 代码库 > linux命令ls -l的total是怎么计算出来的?
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 符号链接的那个实例就可以看出来了。
linux命令ls -l的total是怎么计算出来的?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。