请问ioctl能得到某个硬盘已经使用空间的信息吗?

发布于 2022-07-26 17:48:33 字数 180 浏览 15 评论 6

我知道通过ioctl(fd,BLKGETSIZE,&f_size)可以得到某个硬盘的空间大小信息,请问有有没有类似的办法获得该硬盘已经使用空间的大小.
当然,如果使用df -k也可以得到硬盘使用空间的信息,不过那么做需要把输出信息重定向到文件,然后再对文件进行解析才行,很麻烦。

忘哪位大侠不吝赐教,是在感激不尽。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

你的呼吸 2022-07-27 19:26:21

谢谢楼上的啊, 说的真详细.
我想我已经有办法完成这个功能了.谢谢所有楼上的热心人.

酷炫老祖宗 2022-07-27 19:04:34

原帖由 nj_zhangchuntao 于 2006-10-11 09:34 发表
谢谢楼上的精彩回答. 你的方法的思路就是取得某个分区的挂载点的路径,然后statfs这个挂载点的路径,从而取得它的空间占用信息对不?
不过要取得整个sda硬盘的空间占用信息,必须statfs获取它的从sda1到sda8的空间 ...

你通常只能够知道系统已经挂入的分割区的空间使用率,而不是整个磁碟的分割区的空间使用率。

要知道挂入的分割区有哪些,一般可以解析 /etc/mtab 该文档内容,取每一行以 space 为分隔的第一个项目就是装置名称。

  1. $ cat /etc/mtab
  2. /dev/sda8 / reiserfs rw,noatime,notail 0 0
  3. none /proc proc rw 0 0
  4. /dev/sda11 /tmp reiserfs rw,noexec,nosuid,noatime 0 0
  5. /dev/sda1 /boot ext3 rw,nosuid,nodev,noatime 0 0
  6. /dev/sda6 /usr reiserfs rw,nodev,noatime,notail 0 0
  7. /dev/sda7 /var reiserfs rw,nosuid,nodev,noatime,notail 0 0
  8. /dev/sda9 /home reiserfs rw,nosuid,nodev,noatime,notail 0 0

复制代码

所以这就可以带给 statfs() 呼叫取得相关资讯。

若是你要更低阶一点,也就是要能够知道实际硬碟有哪些分割区,还有分割区档案系统空间使用率 ? 那很抱歉事情没有这么简单。

要这样的话,一般 /proc/partitions 会产生侦测到的 block device 的相关资讯,包含 major/minor number 与 block space 的大小,像是:

  1. $ cat /proc/partitions
  2. major minor  #blocks  name
  3.    3     1  312568641 hda1
  4.    8     0   80418240 sda
  5.    8     1      96358 sda1
  6.    8     2          1 sda2
  7.    8     5    1044193 sda5

复制代码

这个至少可以知道有哪些分割区与划分出来的空间。然后你得具备 ext2/ext3 等 fs 的解析资讯,自己开启 /dev 内的设备档,判断是哪种 filesystem 类型,自行读取 superblock 资讯来取得 block 使用资讯。

==

雾里花 2022-07-27 18:37:08

谢谢楼上的精彩回答. 你的方法的思路就是取得某个分区的挂载点的路径,然后statfs这个挂载点的路径,从而取得它的空间占用信息对不?

不过要取得整个sda硬盘的空间占用信息,必须statfs获取它的从sda1到sda8的空间占用信息,从而获得这个硬盘的占用信息对不?

我现在还有一个问题是,如果硬盘sda,确实分区有sda1到sda8这样8个分区, 我如何用函数确定sda1是对应哪个挂载点啊?

夜夜流光相皎洁 2022-07-27 17:50:27

原帖由 nj_zhangchuntao 于 2006-10-10 21:45 发表
请问楼上的能给点具体信息吗?
我查过statfs函数,似乎没这个功能啊。

  1. $ cat test.c
  2. #include <stdio.h>
  3. #include <sys/statfs.h>
  4. int main()
  5. {
  6.    struct statfs buf;
  7.    int i;
  8.    i = statfs("/",&buf);
  9.    if (i == 0) {
  10.      printf("Filesystem / total block: %ld KB, free block: %ld KBn",
  11.                 buf.f_blocks*buf.f_bsize/1024, buf.f_bfree*buf.f_bsize/1024);
  12.   }
  13.   return 0;
  14. }

复制代码

  1. $ ./a.out
  2. Filesystem / total block: 1566220 KB, free block: 1404452 KB

复制代码

  1. $ df -k /
  2. 檔案系統               1K-區段      已用     可用 已用% 掛載點
  3. /dev/sda8              1566220    161768   1404452  11% /

复制代码

==

薄荷港 2022-07-27 16:44:06

请问楼上的能给点具体信息吗?
我查过statfs函数,似乎没这个功能啊。

南风起 2022-07-27 11:31:49

原帖由 nj_zhangchuntao 于 2006-10-10 20:14 发表
我知道通过ioctl(fd,BLKGETSIZE,&f_size)可以得到某个硬盘的空间大小信息,请问有有没有类似的办法获得该硬盘已经使用空间的大小.
当然,如果使用df -k也可以得到硬盘使用空间的信息,不过那么做需要把输出信 ...

statfs()

man statfs

==

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文