一步一步粗谈linux文件系统(五)----关于fork,文件系统在各个进程中

关于fork,我们都知道fork出新的进程,会复制旧进程的所有资源,且堆栈、数据不共享。所以关于文件系统,要是不共享,会出现怎么样的情况呢?就是说各个进程都有自己的文件系统copy,那种感觉不敢想象,所以他们一定是资源共享的,一定是同步的。

fork新进程的操作中,其中

static structtask_struct *copy_process(unsigned long clone_flags,

unsignedlong stack_start,

structpt_regs *regs,

unsignedlong stack_size,

int__user *parent_tidptr,

int__user *child_tidptr,

intpid)

中调用了

if ((retval =copy_fs(clone_flags,p)))        //文件下系统copy

gotobad_fork_cleanup_files;

最终调用了

static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old)
{
	struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL);	//fs分配一块内存区域
	/* We don't need to lock fs - think why ;-) */
	if (fs) {
		atomic_set(&fs->count, 1);
		rwlock_init(&fs->lock);
		fs->umask = old->umask;
		read_lock(&old->lock);
		fs->rootmnt = mntget(old->rootmnt);
		fs->root = dget(old->root);
		fs->pwdmnt = mntget(old->pwdmnt);
		fs->pwd = dget(old->pwd);
		if (old->altroot) {
			fs->altrootmnt = mntget(old->altrootmnt);
			fs->altroot = dget(old->altroot);
		} else {
			fs->altrootmnt = NULL;
			fs->altroot = NULL;
		}
		read_unlock(&old->lock);
	}
	return fs;
}

亮点在哪?指针!struct fs_struct *fs;你没有看错,就是这个指针,再结合下面的代码,可以得出,fork出来新的文件系统指针指向于旧的那一块指向的。那意味着,后面不管是那个进程的task->fs其实都是进程0创建出来的fs,即前面一篇中所提到的rootfs,所以各个进程间的文件系统是资源共享的,同步的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值