使用ioctl获取磁盘大小
2017-11-21 14:22
489 查看
获取磁盘空间的方法,大部分是根据读取/proc/mounts文件来获取得到,磁盘必须被挂载了之后才能看到,有的还是看不到的,比如:
![](http://img.blog.csdn.net/20171121141652039?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ3NodWFpMTk5MDA1MDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是此时在mounts中却查询不到SWAP分区的信息这样计算出来的磁盘大小就是不准确的。mounts文件内容如下:
这时候使用ioctl函数就比较准确了,代码如下:
运行结果如下:
这里还可以指定分区获取,比如获取sda1、sda2、sda3获取到的内容和lsblk查询出来的是一样的。
除此吃之外还可以使用fdisk这个源码就比较复杂了,也可以使用lsblk,这个源码还没看过。不过看过fdisk的源码相对于ioctrl函数直接获取代码量就大了去了。
但是此时在mounts中却查询不到SWAP分区的信息这样计算出来的磁盘大小就是不准确的。mounts文件内容如下:
[root@bogon ~]# cat /proc/mounts rootfs / rootfs rw 0 0 sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 devtmpfs /dev devtmpfs rw,nosuid,size=485404k,nr_inodes=121351,mode=755 0 0 securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0 cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0 cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 configfs /sys/kernel/config configfs rw,relatime 0 0 /dev/sda3 / xfs rw,relatime,attr2,inode64,noquota 0 0 systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=26,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 mqueue /dev/mqueue mqueue rw,relatime 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,relatime 0 0 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0 /dev/sda1 /boot xfs rw,relatime,attr2,inode64,noquota 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 tmpfs /run/user/0 tmpfs rw,nosuid,nodev,relatime,size=99992k,mode=700 0 0 tmpfs /run/user/1000 tmpfs rw,nosuid,nodev,relatime,size=99992k,mode=700,uid=1000,gid=1000 0 0
这时候使用ioctl函数就比较准确了,代码如下:
#include <stdio.h> #include <fcntl.h> #include <linux/fs.h> int main(void) { int fd; //off_t size unsigned long long size; int len; int r; if ((fd = open("/dev/sda", O_RDONLY)) < 0) { printf("open error %d\n"); return -1; } if ((r = ioctl(fd, BLKGETSIZE64, &size)) < 0) { printf("ioctl error \n"); return -1; } len = (size>>30); printf("size of sda = %d G\n", len); return 0; }
运行结果如下:
[root@bogon disk]# gcc disk.c [root@bogon disk]# ./a.out size of sda = 40 G
这里还可以指定分区获取,比如获取sda1、sda2、sda3获取到的内容和lsblk查询出来的是一样的。
除此吃之外还可以使用fdisk这个源码就比较复杂了,也可以使用lsblk,这个源码还没看过。不过看过fdisk的源码相对于ioctrl函数直接获取代码量就大了去了。
相关文章推荐
- 使用IOCTL_DISK_GET_LENGTH_INFO控制码获取磁盘空间大小
- C#在Linux下获取文件夹信息(所在磁盘总大小,使用空间,已用空间,使用率)
- 使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector
- 使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector
- 使用HD/IDE layer的ioctl接口获取磁盘详细信息device_identify
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
- 编程获取linuxservercpu、内存和磁盘使用
- 使用VMware虚拟磁盘管理工具调整磁盘大小
- java获取磁盘空间大小
- 使用Easyui的控件后,val()方法获取不到值的解决方法和比较日期大小的js方法
- 解决办法之“超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ”
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- linux获取U盘可用空间大小,U盘大小——statfs的使用
- linux 获取磁盘空间大小
- 使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小
- 用来获取sd卡和系统/data分区的使用情况,包括:总的空间大小、可用空间、已用空间
- ioctl()函数的简单使用——获取本机的IP、掩码、HWaddr
- C#实现获取硬盘编号、CPU编号及类型、内存大小及使用情况
- 超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。