mknod



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

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

        普通文件(以及某些特殊文件)可以通过系统调用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位的无符号整型。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值