open.c源代码阅读

本文详细解读了open.c源代码中初始化nd参数的过程,包括设置last_type为LAST_ROOT,flags为参数的flags值,以及depth设为0。同时,讲解了在未进行读操作时如何获取进程的fs->lock读写信号量。当路径名以'/'开头时,查找从根目录开始,否则从当前目录开始,并涉及获取文件对象和目录项对象的地址。最后,释放信号量并重置当前进程的total_link_count,通过link_path_walk()函数继续路径查找操作。
摘要由CSDN通过智能技术生成
就是将open弄明白
open.c的核心就是sys_open()函数 就是找到inode,将inode读出来
当用户空间程序用open系统调用打开一个文件的时候,内核对应的处理是sys_open函数:
fs/open.c
asmlinkage long sys_open(const char __user * filename, int flags, int mode)
{
	char * tmp;
	int fd, error;
#if BITS_PER_LONG != 32
	flags |= O_LARGEFILE;
#endif
	tmp = getname(filename);//从进程地址空间读取该文件的路径名
	fd = PTR_ERR(tmp);
	if (!IS_ERR(tmp)) {
		fd = get_unused_fd();//调用get_unused_fd()在current->files->fd中查找一个空的位置。相应的索引存放在fd局部变量中
		if (fd >= 0) {
			//打开文件,将文件名转换成文件结构
			struct file *f = filp_open(tmp, flags, mode);
			//调用file_open()函数,传递他的参数为路径名、访问模式标志、以及许可权位掩码
			error = PTR_ERR(f);
			if (IS_ERR(f))
				goto out_error;
			fd_install(fd, f);
		}
}
对于filp_open()文件打开函数,filp_open()的定义也在open.c文件中

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值