linux中创建线程和进程的过程非常类似,都是依靠 clone 函数来实现;
也就是说,只需要一个 clone函数,就既能创建进程,又能创建线程;
其中线程创建使用pthread_create函数,进程创建使用fork函数;
其实clone和fork的主要差别是传递了几个參数。
创建进程:clone(SIGCHLD)
创建线程:clone(CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD)
linux 内核没有严格区分线程和进程,线程其实被视为一个与其他进程共享某些资源的进程,看起来就像是一个轻量级的进程。
clone函数原型:
#define _GNU_SOURCE
#include <sched.h>
int clone(int (*fn)(void *), void *stack, int flags, void *arg, ... /* pid_t *parent_tid, void *tls, pid_t *child_tid */ );
long clone3(struct clone_args *cl_args, size_t size);
#include <unistd.h>
pid_t fork(void);
// pid_t是一个宏定义,其实质是 int 被定义在#include <sys/types.h>中,pid_t定义的类型都是进程号类型。范围:0~32767;
// 返回值:若成功调用一次则返回两个值,子进程返回 0,父进程返回子进程PID(