代码之家  ›  专栏  ›  技术社区  ›  Chris Thompson

clone()系统调用最终是否依赖于fork功能?

  •  2
  • Chris Thompson  · 技术社区  · 14 年前

    clone() Linux中的系统调用。我很好奇它到底是怎么工作的,于是就开始挖了起来。令我困惑的是,它似乎依赖于一些与 fork() 功能(他们称之为 do_fork() 函数(尽管参数不同)。一方面,这对我来说是有意义的,因为线程实际上只是一个轻量级的进程,但我一直认为线程的创建方式和进程的创建方式之间存在一些显著的差异。我对 叉子() 后来 copy_process() 叉子() 但我没能说服自己我明白发生了什么。

    所以,对于大师来说,我是不是遗漏了什么,或者这就是它的工作原理?是否有一些标志基本上告诉操作系统要拷贝多少,以及开始执行新任务的指令(我想答案应该是 ,但我不知道他们是怎么翻译的?

    下面是我正在查看的代码,也许您可以解释如何在控制创建轻量级或重量级进程时传递参数。

    asmlinkage int sys_fork(struct pt_regs *regs){
      #ifdef CONFIG_MMU
          return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
      #else
        /* can not support in nommu mode */
        return(-EINVAL);
      #endif
    }
    
    
    asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
                 int __user *parent_tidptr, int tls_val,
                 int __user *child_tidptr, struct pt_regs *regs)
    {
        if (!newsp)
            newsp = regs->ARM_sp;
    
        return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
    }
    

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Ben Voigt    14 年前

    里面什么都没有 the clone manpage 表明它是“轻量级的”。

    fork 创建新的地址空间,而 可选地共享父级和子级之间的地址空间,以及文件句柄等。

    这个共享的地址空间允许以后使用轻量级IPC,但进程本身并不是更精简的。

        2
  •  4
  •   ninjalj    14 年前

    实际上,在概念层面上,Linux内核对进程或线程一无所知,只知道“任务”。

    Linux任务可以是进程、线程或介于两者之间的东西。(顺便说一下,这意味着vfork()创建的奇怪子代完全适合Linux“任务”范式)。

    或者新任务可以选择拥有各自资源的副本。从2.6.16开始,它们可以在启动后执行,请参见取消共享(2)。

    例如,vfork()和fork()调用之间的唯一区别是vfork()具有CLONE-VM和CLONE-vfork集。CulONYVM使其共享其父内存(与线程共享内存的方式相同),而C克隆OnFoFor则在父进程释放内存映射(通过调用ExvEvE()或μExt())时生成父块。

    注意,Linux并不是唯一一个以这种方式泛化进程和线程的操作系统。计划9具有rfork()。

        3
  •  1
  •   Yusuf Khan    14 年前

    我知道这三个clone、fork和vfork之间的区别在于标志,因为最后这三个都调用内核中的do_fork()

    fork()-->C_lib-->sys_fork()-->do_fork()

    vfork()-->C_lib-->sys_vfork()-->do_fork()

    clone()-->C_lib-->sys_clone()-->do_fork()

    现在让我们看看克隆标志

    克隆的主要用途是实现线程,在线程中内存空间共享,然后堆栈。除了与fork和vfork相同的参数外,clone还将函数指针作为参数,在创建子进程时立即调用该参数。