fork系统调用最终调用到do_dork 函数中:
int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)
{
int retval = -ENOMEM;
struct task_struct *p;
DECLARE_MUTEX_LOCKED(sem);
if (clone_flags & CLONE_PID) {
/* This is only allowed from the boot up thread */
if (current->pid)
return -EPERM;
}
current->vfork_sem = &sem;
p = alloc_task_struct();
if (!p)
goto fork_out;
*p = *current;
retval = -EAGAIN;
if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur)
goto bad_fork_free;
atomic_inc(&p->user->__count);
atomic_inc(&p->user->processes);
。。。。。。
但是在阅读到上面红色代码的时候,思考了一些问题,书上也没有详细说明,记录下来。
红色部分是对所属用户的最大进程数进行限制,如果新创建进程时,发现已经超过最大进程数了,
就返回错误。但是我想,如果有两个进程A和B,他们两个拥有相同的user。当进程A fork时,
user所拥有的进程刚好是上限-1,差一个不到上限,通过了判断语句。此时,如果进程B 调用fork,
也就是在进程A执行atomic_inc(&p->user->processes)之前,B进程判断上限也能通过,岂不是会
造成一个user的进程上限突破了限制。
所以我感觉这个地方是不是应该加一个锁,让判断语句和增加语句成为一个受保护的临界区,
这样进程A执行完判断,将计数增加后,进程B才能进入执行,得到正确的计数,才能做出正确的
user所拥有的进程上限判断。
不知道个人理解是不是有问题,如有错误请指正,希望有朋友可以一起讨论,交流!!!!!
阅读(1030) | 评论(0) | 转发(0) |