mknod

来源:互联网 发布:sql 几种树形结构 编辑:程序博客网 时间:2024/05/29 12:42


一、设备文件和普通文件的区别

        设备文件是文件系统中代表设备的特殊文件。与普通的文件相比,设备文件在磁盘(或宿主文件系统所的在其它设备)上只占用一个索引节点,而没有任何用于存放数据的记录块与之相联系。当然,这是因为设备文件的目的并不在于存储和读取数据,而只在于为应用程序提供一条通向具体设备的途径,使应用程序可以跟具体设备建立起连接。

        普通文件(以及某些特殊文件)可以通过系统调用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_XATTRinode->i_op = &ext2_special_inode_operations;#endifmark_inode_dirty(inode);err = ext2_add_nondir(dentry, inode);}return err;}
其中参数rdev为设备号,其类型为dev_t,它是一个32位的无符号整型。





0 0
原创粉丝点击