linux内核之chdir分析

今天我们看一些在linux系统里边经常使用的cd命令对应的内核实现,就是sys_chdir函数的实现。
sys_chdir函数在fs/open.c里,定义如下
asmlinkage long sys_chdir(const char __user * filename)
{
	/*路径名查找函数*/
	struct nameidata nd;
	int error;
	/*之前我们分析过,根据得到的文件名,找到对应的dentry和mnt结构体放入nameidata结构体里边*/
	error = __user_walk(filename,
			    LOOKUP_FOLLOW|LOOKUP_DIRECTORY|LOOKUP_CHDIR, &nd);
	if (error)
		goto out;
	/*vfs层权限检查,前边也分析过*/
	error = vfs_permission(&nd, MAY_EXEC);
	if (error)
		goto dput_and_out;
	/*主要的工作函数,设置进程当前工作路径*/
	set_fs_pwd(current->fs, nd.mnt, nd.dentry);


dput_and_out:
	/*释放建立的nameidata结构体*/
	path_release(&nd);
out:
	return error;
}

然后我们看set_fs_pwd函数,这个函数定义在fs/namespace.c里,定义如下
void set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
		struct dentry *dentry)
{
	/*指向当前进程结构体里的fs_struct里的dentry和mnt结构体,就是原来的路径*/
	struct dentry *old_pwd;
	struct vfsmount *old_pwdmnt;


	write_lock(&fs->lock);
	old_pwd = fs->pwd;
	old_pwdmnt = fs->pwdmnt;
	/*把进程结构体task_struct里的pwd和pwdmnt指向新的dentry和vfsmount结构体*/
	fs->pwdmnt = mntget(mnt);
	fs->pwd = dget(dentry);
	write_unlock(&fs->lock);
	/*释放原先的dentry和vfsmount*/
	if (old_pwd) {
		dput(old_pwd);
		mntput(old_pwdmnt);
	}
}


从这里我们就可以看书vfs_lookup是内核里贯穿文件系统的一个函数,理解了vfs_lookup函数,就基本上可以说是对于文件系统有了一个大致的了解了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的代码是一个使用chdir函数的示例程序。chdir函数是Linux系统中的一个系统调用,用于改变当前工作目录。在这个示例程序中,chdir函数被用于将当前工作目录更改为通过命令行参数传递的目录。然后,程序使用getcwd函数获取当前工作目录,并打印出来。 另外,引用提到了chdir系统调用和getcwd函数,它们都与目录操作有关。chdir函数用于改变当前工作目录,而getcwd函数用于获取当前工作目录的路径。 需要注意的是,chdir函数只会改变当前进程的工作目录,不会影响到其他进程的工作目录。所以,引用中提到的情况是因为程序创建了一个子进程并由子进程执行,所以父进程的工作目录没有变化。 总结起来,Linuxchdir函数是用来改变当前工作目录的系统调用,而getcwd函数用于获取当前工作目录的路径。这些函数可以用于在程序中进行目录操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux下C中chdir函数](https://blog.csdn.net/zxy131072/article/details/108533049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [liqingqiya#blog#linux关于文件和目录的函数1](https://download.csdn.net/download/weixin_35757531/86256188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [linuxchdir函数解析](https://blog.csdn.net/weixin_39668527/article/details/116763990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值