来源:http://my.oschina.net/sincoder/blog/132303
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 的系统调用而是对系统调用的封装 。
首先需要给新的线程创建个堆栈 ,使用函数 mmap ,这个函数常用来完成文件映射 ,这里分配内存也是可以的
void *pstack = (void *)mmap(NULL,
STACK_SIZE,
PROT_READ | PROT_WRITE ,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_ANON ,//| MAP_GROWSDOWN ,
-1,
0
);
通过指定 MAP_ANONYMOUS 标识 系统就不会创建文件映射 而仅仅分配内存
注意堆栈不要太小了 不然会溢出的。。。。。。
然后调用 clone 函数
ret = clone( thread_func,
(void *)((unsigned char *)pstack + STACK_SIZE),
CLONE_VM | CLONE_FS | CLONE_THREAD | CLONE_FILES | CLONE_SIGHAND | SIGCHLD,