stat中的st_dev和st_rdev

stat中的st_dev和st_rdev

Copy
dev_t st_dev; /* ID of device containing file */ dev_t st_rdev; /* Device ID (if special file) */

这两个存的都是主次设备号,都要通过宏majorminor来取出来

  • st_dev 存的是文件本身存储设备的设备号,也就是硬盘的设备号
  • st_rdev是针对驱动的字符设备和块设备文件的主次设备号

看例子,先看下我的硬盘,ls -l看下硬盘设备的设备号

Copy
$ df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 796M 8.7M 787M 2% /run /dev/sda1 30G 28G 908M 97% / tmpfs 796M 0 796M 0% /run/user/1000 $ ls -l /dev/sda1 brw-rw---- 1 root disk 8, 1 Nov 18 17:06 /dev/sda1 reallin@ubuntu:/dev$ ls -l /dev/sdb brw-rw---- 1 root disk 8, 16 Nov 18 17:06 /dev/sdb reallin@ubuntu:/dev$ ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 Nov 18 17:06 /dev/sdb1 v$ ls -l /dev/zero crw-rw-rw- 1 root root 1, 5 Nov 18 17:06 /dev/zero

再来执行程序,查看可以看到确实是第二块硬盘的设备号

Copy
> ./devrdev access.c ../ access.c: dev = 8/17 ../: dev = 8/17

再看看其他的设备文件,后面的号是字符设备的设备号了,前面那个0-6 也不是我们的主硬盘 不知道是啥情况

Copy
/dev/ttyS0: dev = 0/6 (character) rdev = 4/64 /dev/zero: dev = 0/6 (character) rdev = 1/5

附录程序

Copy
#include "apue.h" #ifdef SOLARIS #include <sys/mkdev.h> #endif #include <sys/sysmacros.h> int main(int argc, char *argv[]) { int i; struct stat buf; for (i = 1; i < argc; i++) { printf("%s: ", argv[i]); if (stat(argv[i], &buf) < 0) { err_ret("stat error"); continue; } printf("dev = %d/%d", major(buf.st_dev), minor(buf.st_dev)); if (S_ISCHR(buf.st_mode) || S_ISBLK(buf.st_mode)) { printf(" (%s) rdev = %d/%d", (S_ISCHR(buf.st_mode)) ? "character" : "block", major(buf.st_rdev), minor(buf.st_rdev)); } printf("\n"); } exit(0); }
posted @   zongzi10010  阅读(2589)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示