linux命令ls -l的total是怎么计算出来的?

本文详细解析了如何手写实现ls-l命令中文件占用块的计算方法,并特别指出符号链接不计入total值中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/Harley-Quinn/p/6591450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值