全部博文(140)
分类: LINUX
2014-02-23 20:33:02
原文地址:Linux 中使用 clone 函数来创建线程 作者:phoenixcsl
首先需要给新的线程创建个堆栈 ,使用函数 mmap ,这个函数常用来完成文件映射 ,这里分配内存也是可以的
通过指定 MAP_ANONYMOUS 标识 系统就不会创建文件映射 而仅仅分配内存
注意堆栈不要太小了 不然会溢出的。。。。。。
然后调用 clone 函数
几个标识的意义
flags |
value |
discription |
CLONE_VM |
(0x100) |
tells the kernel to let the original process and the clone in the same memory space; |
CLONE_FS |
(0x200) |
both get the same file system information |
CLONE_FILES |
(0x400) |
share file descriptors |
CLONE_SIGHAND |
(0x800) |
both processes share the same signal handlers; |
CLONE_THREAD |
(0x10000) |
this tells the kernel, that both processes would belong to the same thread group (be threads within the same process) |
使用clone 的时候 指定 CLONE_THREAD 那么以后就不能使用 wait 来等待这个线程了相当于 deteched .了。。。查看man 手册可以看到
A new thread created with CLONE_THREAD has the same parent process as the caller of clone() (i.e., like CLONE_PARENT), so that calls to getppid(2) return the same value for all of the threads in a thread group. When a CLONE_THREAD thread terminates, the thread that created it using clone() is not sent a SIGCHLD (or other termination) signal; nor can the status of such a thread be obtained using wait(2). (The thread is said to be detached.)
下面是我测试的代码
来源:http://www.cnblogs.com/wanghetao/archive/2011/11/06/2237931.html
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
这里fn是函数指针,我们知道进程的4要素,这个就是指向程序的指针,就是所谓的“剧本",
child_stack明显是为子进程分配系统堆栈空间(在linux下系统堆栈空间是2页面,就是8K的内存,其中在这块内存中,低地址上放入了值,这
个值就是进程控制块task_struct的值),flags就是标志用来描述你需要从父进程继承那些资源,
arg就是传给子进程的参数)。下面是flags可以取的值
创建子进程的父进程是调用者的父进程新进程与创建它的进程成了“兄弟”而不是“父子”
子进程与父进程共享相同的文件系统,包括root、当前目录、umask
子进程与父进程共享相同的文件描述符(file descriptor)表
下面的例子是创建一个线程(子进程共享了父进程虚存空间,没有自己独立的虚存空间不能称其为进程)。父进程被挂起当子线程释放虚存资源后再继续执行。
标志
含义
CLONE_PARENT
CLONE_FS
CLONE_FILES
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线程标准,子进程与父进程共享相同的线程群