Linux内核源代码情景分析-系统调用mknod

博客内容探讨了Linux内核中的mknod系统调用,主要用于创建设备文件。文章通过分析sys_mknod、lookup_create、may_create等关键函数,展示了如何在Ext2文件系统下执行mknod操作,并引用了/dev/sdb1和/tmp/server_socket作为实际应用示例。
摘要由CSDN通过智能技术生成

    普通文件可以用open或者create创建,FIFO文件可以用pipe创建,mknod主要用于设备文件的创建。

    在内核中,mknod是由sys_mknod实现的,代码如下:

asmlinkage long sys_mknod(const char * filename, int mode, dev_t dev) //比如filename为/tmp/server_socket,dev是设备号
{
	int error = 0;
	char * tmp;
	struct dentry * dentry;
	struct nameidata nd;

	if (S_ISDIR(mode))
		return -EPERM;
	tmp = getname(filename);
	if (IS_ERR(tmp))
		return PTR_ERR(tmp);

	if (path_init(tmp, LOOKUP_PARENT, &nd))//寻找父节点,这里就是/tmp节点
		error = path_walk(tmp, &nd);
	if (error)
		goto out;
	dentry = lookup_create(&nd, 0);//寻找/tmp/server_socket节点,返回该节点的dentry结构,但是dentry->d_inode为NULL
	error = PTR_ERR(dentry);
	if (!IS_ERR(dentry)) {
		switch (mode & S_IFMT) {
		case 0: case S_IFREG://普通文件
			error = vfs_create(nd.dentry->d_inode,dentry,mode);
			break;
		case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK://字符设备,块设备,管道,socket文件
			error = vfs_mknod(nd.dentry->d_inode,mode,dev);//创建/tmp/server_socket节点的inode结构,并关联到文件系统中
			break;
		case S_IFDIR:
			error = -EPERM;
			break;
		default:
			error = -EINVAL;
		}
		dput(dentry);
	}
	up(&nd.dentry->d_inode->i_sem);
	path_release(&nd);
out:
	putname(tmp);

	return error;
}

    lookup_create,寻找/tmp/server_socket节点,代码如下:

</

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值