一、设备文件和普通文件的区别
设备文件是文件系统中代表设备的特殊文件。与普通的文件相比,设备文件在磁盘(或宿主文件系统所的在其它设备)上只占用一个索引节点,而没有任何用于存放数据的记录块与之相联系。当然,这是因为设备文件的目的并不在于存储和读取数据,而只在于为应用程序提供一条通向具体设备的途径,使应用程序可以跟具体设备建立起连接。
普通文件(以及某些特殊文件)可以通过系统调用open来创建,只要在调用参数中或上O_CREAT标志,就可以让open函数在目标文件不存在时先创建这个文件。当然也可通过调用creat()来直接创建文件,事实上sys_creat()就是通过sys_open()实现的。可是这两个系统调用都不能用来创建设备文件,因为设备文件的创建需要有一个参数来传递设备号,而open和creat函数都不包括这个参数。此时就是mknod函数存在的意义了。
二、mknod()函数介绍
mknod()函数可以用来创建各种类型的文件(目录除外),包括普通文件、特殊文件以及设备文件,不过,这些类型的文件习惯用各自专用的系统调用,如普通文件可
以open()和creat()创建,FIFO文件可以用pipe()创建,所以mknod()主要用于设备文件的创建。不像open()函数集创建与打开于一身,mknod()只是纯粹的创建。
在Linux内核源码fs/xxx/namei.c(其中xxx表示各种文件系统格式,比如ext2、ext4、ntfs)中有一个结构:inode_operations,此结构体中含有mknod函数,以
fs/ext2/namei.c为例:
const struct inode_operations ext2_dir_inode_operations = {
.create = ext2_create,
.lookup = ext2_lookup,
.link = ext2_link,
.unlink = ext2_unlink,
.symlink = ext2_symlink,
.mkdir = ext2_mkdir,
.rmdir = ext2_rmdir,
<strong>.mknod = ext2_mknod,</strong>
……
}
而ext2_mknod函数如下:
static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)
{
struct inode * inode;
int err;
if (!new_valid_dev(rdev))
return -EINVAL;
dquot_initialize(dir);
inode = ext2_new_inode (dir, mode, &dentry->d_name);
err = PTR_ERR(inode);
if (!IS_ERR(inode)) {
init_special_inode(inode, inode->i_mode, rdev);
#ifdef CONFIG_EXT2_FS_XATTR
inode->i_op = &ext2_special_inode_operations;
#endif
mark_inode_dirty(inode);
err = ext2_add_nondir(dentry, inode);
}
return err;
}
其中参数rdev为设备号,其类型为dev_t,它是一个32位的无符号整型。