• 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 符号链接的那个实例就可以看出来了。

  • 相关阅读:
    NOIP知识点&&模板整理【更新中】
    qbxt DAY7 T4
    qbxt DAY7 T2
    qbxt DAY 6 T3 柯西不等式和拉格朗日不等式
    qbxt DAY4 T4
    qbxt DAY4 T3
    #98. 表达式计算 杂想
    扫描线入门学习笔记 (主要讲解代码实现)
    学OI要知道的基础知识(咕咕咕)
    主定理学习笔记(总结向)
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/6591450.html
Copyright © 2020-2023  润新知