linuxclone函数的参数,linuxclone函数使⽤
Linux 上创建线程⼀般使⽤的是 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 的系统调⽤ ⽽是对系统调⽤的封装 。
Linux将创建进程和执⾏所创建的进程分为2个阶段。第⼀个阶段是创建。⽗进程⾸先复制⼦进程,所复制出来的⼦进程拥有⾃⼰的任务结构体和系统堆栈,除此之外所有资源都与⽗进程共享。Linux提供两种⽅式复制⼦进程:⼀个是fork(),另外⼀个是clone()。fork()函数复制时将⽗进程的所以资源都通过复制数据结构进⾏了复制,然后传递给⼦进程,所以fork()函数不带参数;clone()函数则是将部分⽗进程的资源的数据结构进⾏复制,复制哪些资源是可选择的,这个可以通过参数设定,所以clone()函数带参数,没有复制的资源可以通过指针共享给⼦进程。Clone()函数的声明如下:
cloneint 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创建的⼦进程要先于⽗进程执⾏,⼦进程执⾏时,⽗进程处于挂起状态,⼦进程执⾏完,唤醒⽗进程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论