设为首页 加入收藏

TOP

内核进程的复制(十)
2012-11-01 15:47:27 来源: 作者: 【 】 浏览:3012
Tags:内核 进程 复制

  
  七,开始复制
  
  [cpp]
  
  if ((retval = security_task_alloc(p)))
  
  goto bad_fork_cleanup_policy;
  
  if ((retval = audit_alloc(p)))
  
  goto bad_fork_cleanup_security;
  
  /* copy all the process information */
  
  if ((retval = copy_semundo(clone_flags, p)))System V信号量
  
  goto bad_fork_cleanup_audit;
  
  if ((retval = copy_files(clone_flags, p)))文件描述符
  
  goto bad_fork_cleanup_semundo;
  
  if ((retval = copy_fs(clone_flags, p)))文件系统上下文
  
  goto bad_fork_cleanup_files;
  
  if ((retval = copy_sighand(clone_flags, p)))进程信息处理程序
  
  goto bad_fork_cleanup_fs;
  
  if ((retval = copy_signal(clone_flags, p)))
  
  goto bad_fork_cleanup_sighand;
  
  if ((retval = copy_mm(clone_flags, p)))地址空间
  
  goto bad_fork_cleanup_signal;
  
  if ((retval = copy_keys(clone_flags, p)))
  
  goto bad_fork_cleanup_mm;
  
  if ((retval = copy_namespaces(clone_flags, p)))
  
  goto bad_fork_cleanup_keys;
  
  retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
  
  if (retval)
  
  goto bad_fork_cleanup_namespaces;
  
  这里有各种Copy.
  
  八,分配PID等操作
  
  [cpp]
  
  if (pid != &init_struct_pid) {
  
  retval = -ENOMEM;
  
  pid = alloc_pid(task_active_pid_ns(p));
  
  if (!pid)
  
  goto bad_fork_cleanup_namespaces;
  
  if (clone_flags & CLONE_NEWPID) {
  
  retval = pid_ns_prepare_proc(task_active_pid_ns(p));
  
  if (retval < 0)
  
  goto bad_fork_free_pid;
  
  }
  
  }
  
  p->pid = pid_nr(pid);
  
  p->tgid = p->pid;
  
  if (clone_flags & CLONE_THREAD)
  
  p->tgid = current->tgid;
  
  p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) child_tidptr : NULL;
  
  /*
  
  * Clear TID on mm_release()?
  
  */
  
  p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) child_tidptr: NULL;
  
  #ifdef CONFIG_FUTEX
  
  p->robust_list = NULL;
  
  #ifdef CONFIG_COMPAT
  
  p->compat_robust_list = NULL;
  
  #endif
  
  INIT_LIST_HEAD(&p->pi_state_list);
  
  p->pi_state_cache = NULL;
  
  #endif
  
  /*
  
  * sigaltstack should be cleared when sharing the same VM
  
  */
  
  if ((clone_flags & (CLONE_VM|CLONE_VFORK)) == CLONE_VM)
  
  p->sas_ss_sp = p->sas_ss_size = 0;
  
  /*
  
  * Syscall tracing should be turned off in the child regardless
  
  * of CLONE_PTRACE.
  
  */
  
  clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE);
  
  #ifdef TIF_SYSCALL_EMU
  
  clear_tsk_thread_flag(p, TIF_SYSCALL_EMU);
  
  #endif
  
  /* Our parent execution domain becomes current domain
  
  These must match for thread signalling to apply */
  
  p->parent_exec_id = p->self_exec_id;
  
  /* ok, now we should be set up */
  
  p->exit_signal = (clone_flags & CLONE_THREAD) -1 : (clone_flags & CSIGNAL);
  
  p->pdeath_signal = 0;
  
  p->exit_state = 0;
  
  /*
  
  * Ok, make it visible to the rest of the system.
  
  * We dont wake it up yet.
  
  */
  
  p->group_leader = p;
  
  INIT_LIST_HEAD(&p->thread_group);
  
  INIT_LIST_HEAD(&p->ptrace_children);
  
  INIT_LIST_HEAD(&p->ptrace_list);
  
  /* Now that the task is set up, run cgroup callbacks if
  
  * necessary. We need to run them before the task is visible
  
  * on the tasklist. */
  
  cgroup_fork_callbacks(p);
  
  cgroup_callbacks_done = 1;
  
  /* Need tasklist lock for parent etc handling! */
  
  write_lock_irq(&tasklist_lock);
  
  /* for sys_ioprio_set(IOPRIO_WHO_PGRP) */
  
  p->ioprio = current->ioprio;
  
  /*
  
  * The task hasn't been attached yet, so its cpus_allowed mask will
  
  * not be changed, nor will its assigned CPU.
  
  *
  
  * The cpus_allowed mask of the parent may have changed after it was
  
  * copied first time - so re-copy it here, then check the child's CPU
  
  * to ensure it is on a valid CPU (and if not, just force it back to
  
  * parent's CPU)。 This avoids alot of nasty races.
  
  */
  
  p->cpus_allowed = current->cpus_allowed;
  
  if (unlikely(!cpu_isset(task_cpu(p), p->cpus_allowed) ||
  
  !cpu_online(task_cpu(p))))
  
  set_task_cpu(p, smp_processor_id());

            

首页 上一页 7 8 9 10 11 12 13 下一页 尾页 10/16/16
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C/C++学习指针一些事 下一篇C/C++学习之++i 和 i++..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: