copy_process

 

 

copy_process

2011-7-14 16:00:12

 if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
  return ERR_PTR(-EINVAL);
  
想有新的命名空间就不能共享文件

 if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
  return ERR_PTR(-EINVAL);
  
如果是创建线程就需要共享信号


 if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
  return ERR_PTR(-EINVAL);


共享信号处理就需要共享地址空间

 retval = security_task_create(clone_flags);
 
 进行安全检测
 
  p = dup_task_struct(current);
  
  复制进程描述符
  
  dup_task_struct 流程
  
  alloc_task_struct
  
  #define alloc_thread_info(tsk) \
 ((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER))
 
 分配了2个页的空间
 
  *tsk = *orig;
  
  按值进行拷贝
  
   tsk->thread_info = ti;
   
   设置了自己的thread_info
   
    setup_thread_stack(tsk, orig);
    
   也是按值拷贝
   
    atomic_set(&tsk->usage,2);
 atomic_set(&tsk->fs_excl, 0);
 
  if (atomic_read(&p->user->processes) >=
   p->signal->rlim[RLIMIT_NPROC].rlim_cur) {
  if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
    p->user != &root_user)
   goto bad_fork_free;
 }

进行资源限制判断

如果系统支持SYSV IPC 还需要拷贝这些信息

get_undo_list

如果当前进程有undo list,就使用当前进程的undo list,否则还需要创建一个新的

如果flags中有 CLONE_SYSVSEM

就将undo list的引用计数加1

否则就置为null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值