一、设备编号
主设备号表示设备对应的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。
内核用dev_t类型(<linux/types.h>)来保存设备编号。linux提供相应的宏实现dev_t与设备号之间的转换。

(dev_t)-->主设备号、次设备号
#include <linux/kdev_t.h>
MAJOR(dev_t dev);
MINOR(dev_t dev);

主设备号、次设备号-->(dev_t)
#include <linux/kdev_t.h>
MKDEV(int major,int minor);
建立一个字符设备之前,驱动程序首先要做的事情就是获得设备编号。

二、获取设备号的函数
(1)若用户提前知道设备编号
#include<linux/fs.h>
int register_chrdev_region(dev_tfirst, unsigned int count,char *name);
dev_t first: 要分配设备编号范围的起始值
unsigned int count:所请求的连续设备编号的个数
char *name:和该范围关联的设备名称
返回值:
成功:0
失败:-EFAULT

(2)若用户不知道设备编号(动态生成设备编号)
#include<linux/fs.h>
int alloc_chrdev_region(dev_t*dev, unsigned int firstminor, unsigned int count, char*name);
dev_t *dev:仅用于输出的参数,在成功完成调用之后将保存已分配范围的第一个编号
unsigned int firstminor:要使用的被请求的第一个次设备号,通常为0
unsigned int count:所请求的连续设备编号的个数
char *name:和该范围关联的设备名称
返回值:
成功:0
失败:-EFAULT

(3)释放设备编号
voidunregister_chrdev_region(dev_t first, unsigned intcount);

三、获取设备号的实例:
int result;
dev_t dev = MKDEV(l2_drv_major, 0);
if (l2_drv_major)
{
 
    result =register_chrdev_region(dev, l2_drv_devs, "l2_drv");
}
else
{
 
    result =alloc_chrdev_region(&dev, 0, l2_drv_devs,"l2_drv");
 
    l2_drv_major= MAJOR(dev);
 
}
if (result < 0)


------------------------------我是分割线-----------------------------------


设备ID和i节点号

st_dev字段标识文件所驻留的设备。st_ino字段包含了文件的i节点号。利用这两个字段,可以在所有文件系统中唯一表示某个文件。

如果是针对设备的i节点,那么st_rdev字段则包含设备的主、辅ID。利用宏major()和minor(),可以提取主、辅ID。在Linux系统上,要使用这两个宏,需要定义_BSD_SOURCE宏,然后include定义这两个宏的头文件<sys/types.h>。

由于major()和minor()所返回的整型值大小随UINX实现的不同而各有不用。为保证可移植性,打印时总是将返回值强制转换为long。 

文件所有权

st_uid和st_gid字段分别表示文件的属主(用户ID)和属组(组ID)。

链接数

st_nlink字段包含了指向文件的(硬)链接数。

文件类型及权限

st_mode字段内含有位掩码,起表示文件类型和指定文件权限的双重作用。下图为该字段所含各位的布局情况。

文件类型

权限





U

G

T

R

W

X

R

W

X

R

W

X

Linux使用了st_mode字段中的4位来标识文件类型位。st_mode字段与常量S_IFMT相与(&),可从该字段中提取出文件类型。将计算结果与一系列常量进行比较,即可确定文件类型:

if((statbuf.st_mode & S_IFMT) == S_IFREG)

printf(“regularfile\n”);

在Linux中可利用标准宏将其简化:

if(S_ISREG(statbuf.st_mode))

printf(“regularfile\n”);

常 量

测 试 宏

文 件 类 型

S_IFREG

S_ISREG()

常规文件

S_IFDIR

S_ISDIR()

目录

S_IFCHR

S_ISCHR()

字符设备

S_IFBLK

S_ISBLK()

块设备

S_IFIFO

S_ISFIFO()

FIFO或管道

S_IFSOCK

S_ISSOCK()

套接字

S_IFLNK

S_ISLNK()

符号链接

针对stat结构中的st_mode来检查文件类型的宏

想从<sys/stat.h>中获取S_IFSOCK和S_ISSOCK()的定义,必须定义_BSD_SOURCE特性测试宏,或将_XOPEN_SOURCE定义为不小于500的值。

st_mode字段的低12位定义了文件权限。最低9位分别用来表示文件属主、属组以及其他用户的读、写、执行权限。

文件大小、已分配块以及最优I/O块大小

对于常规文件,st_size字段表示文件的字节数。对于符号链接,st_size字段则表示链接所指路径名的长度,以字节为单位。对于共享内存对象,该字段则表示对象的大小。

st_blocks字段表示分配给文件的总块数,块大小为512字节,其中包括了为指针块所分配的空间。st_blocks字段记录了实际分配给文件的磁盘块数量。如果文件内含空洞,该值将小于从相应文件字节数字段(st_size)的值。

st_blksize字段所指并非底层文件系统的块大小,而是针对文件系统上文件进行I/O操作时的最优块大小(以字节为单位)。一般而言,st_blksize的返回值为4096。


GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:4 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐