博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux clone函数使用
阅读量:4212 次
发布时间:2019-05-26

本文共 1576 字,大约阅读时间需要 5 分钟。

转载自:http://blog.csdn.net/u013013553/article/details/42031793

  上创建线程一般使用的是 pthread 库  实际上 libc 也给我们提供了创建线程的函数  那就是 clone

       int clone(int (*fn)(void *), void *child_stack,

                 int flags, void *arg, ...
                 /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
man 手册里面说的很清楚这个函数存在的意义就是实现 线程  当然这个函数不是 的系统调用 而是对系统调用的封装 。    

Linux将创建进程和执行所创建的进程分为2个阶段。第一个阶段是创建。父进程首先复制子进程,所复制出来的子进程拥有自己的任务结构体和系统堆栈,除此之外所有资源都与父进程共享。Linux提供两种方式复制子进程:一个是fork(),另外一个是clone()。fork()函数复制时将父进程的所以资源都通过复制进行了复制,然后传递给子进程,所以fork()函数不带参数;clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以clone()函数带参数,没有复制的资源可以通过指针共享给子进程。Clone()函数的声明如下:

int clone(int (*fn)(void *), void*child_stack, int flags, void *arg)

fn为函数指针,此指针指向一个函数体,即想要创建进程的静态程序;child_stack为给子进程分配系统堆栈的指针;arg就是传给子进程的参数;flags为要复制资源的标志:

CLONE_PARENT   创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”

 CLONE_FS           子进程与父进程共享相同的文件系统,包括root、当前目录、umask

  CLONE_FILES      子进程与父进程共享相同的文件描述符(file descriptor)表

  CLONE_NEWNS   在新的namespace启动子进程,namespace描述了进程的文件hierarchy

  CLONE_SIGHAND   子进程与父进程共享相同的信号处理(signal handler)表

  CLONE_PTRACE   若父进程被trace,子进程也被trace

  CLONE_VFORK     父进程被挂起,直至子进程释放虚拟内存资源

 CLONE_VM           子进程与父进程运行于相同的内存空间

 CLONE_PID          子进程在创建时PID与父进程一致

  CLONE_THREAD    Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群

fork()可以看出是完全版的clone(),而clone()克隆的只是fork()的一部分。

   为了提高系统的效率,后来的Linux设计者又增加了一个系统调用vfork()。vfork()所创建的不是进程而是线程,它所复制的是除了任务结构体和系统堆栈之外的所有资源的数据结构,而任务结构体和系统堆栈是与父进程共用的。

  第二个阶段就是所创建进程的执行。子进程创建完后一般都会走自己的路。Linux为了子进程能做自己的事特意提供了一个系统调用execve(),用以执行一个可执行程序的映像,这个映像以文件形式存在(这句话其实就是说用execve()可以调用一个可执行程序,因为这个可执行程序就在磁盘上,所有是以文件形式存在的,而映像是说已经编译链接好了的,只要调入内存就可以执行,一般为二进制文件)。vfork创建的子进程要先于父进程执行,子进程执行时,父进程处于挂起状态,子进程执行完,唤醒父进程。

你可能感兴趣的文章
(六) Git--标签管理
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
java反射详解
查看>>
JPA 注解
查看>>
JQuery 简介
查看>>
Java创建对象的方法
查看>>
Extjs自定义组件
查看>>
TreeGrid 异步加载节点
查看>>
Struts2 标签库讲解
查看>>
Google Web工具包 GWT
查看>>
材料与工程学科相关软件
查看>>
windows 下AdNDP 安装使用
查看>>
Project 2013项目管理教程(1):项目管理概述及预备
查看>>
ssh客户端后台运行
查看>>
【React Native】把现代web科技带给移动开发者(一)
查看>>
【GoLang】Web工作方式
查看>>
Launch Sublime Text 3 from the command line
查看>>
【数据库之mysql】mysql的安装(一)
查看>>