title: stat中的st_dev和st_rdev
date: 2019/11/27 21:04:25
toc: true
stat中的st_dev和st_rdev
dev_t st_dev; /* ID of device containing file */
dev_t st_rdev; /* Device ID (if special file) */
这两个存的都是主次设备号,都要通过宏major
和minor
来取出来
st_dev
存的是文件本身存储设备的设备号,也就是硬盘的设备号st_rdev
是针对驱动的字符设备和块设备文件的主次设备号
看例子,先看下我的硬盘,ls -l
看下硬盘设备的设备号
$ 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
再来执行程序,查看可以看到确实是第二块硬盘的设备号
> ./devrdev access.c ../
access.c: dev = 8/17
../: dev = 8/17
再看看其他的设备文件,后面的号是字符设备的设备号了,前面那个0-6
也不是我们的主硬盘 不知道是啥情况
/dev/ttyS0: dev = 0/6 (character) rdev = 4/64
/dev/zero: dev = 0/6 (character) rdev = 1/5
附录程序
#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("
");
}
exit(0);
}