• stat中的st_dev和st_rdev



    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) */
    

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

    • 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);
    }
    
    
  • 相关阅读:
    记一次ntp反射放大ddos攻击
    除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)
    vmware linux虚拟机忘记密码怎么办
    flask(二)
    flask(一)
    发布一个Django项目
    nginx的使用
    redis的下载及使用
    Linux虚拟机没有IP的解决办法
    Mariadb的安装与使用
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/11945545.html
Copyright © 2020-2023  润新知