Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4422
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2017-02-07 15:49
文章分类
文章存档

2017年(1)

我的朋友
最近访客

分类: LINUX

2017-02-07 18:27:36

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所拥有的进程上限判断。
      不知道个人理解是不是有问题,如有错误请指正,希望有朋友可以一起讨论,交流!!!!!
阅读(1005) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~