linux系统调用fork()、vfork()、clone()讲解
clone()主要用来创建一个线程,可以是内核线程和用户线程,也可以创建进程,有选择的复制父进程资源。
fork()用来全面复制父进程资源
vfork()也是用来创建线程,但主要知识作为创建进程的中间步骤。
这三个函数主要是通过配置do_fork()函数来实现的。
int do_fork(unsigned long clone_flags, unsigned long stack_start,
{
int retval = -ENOMEM;
struct task_struct *p;
DECLARE_MUTEX_LOCKED(sem);产生同步互斥的信号量
if (clone_flags & CLONE_PID) {如果父子进程共享同一个进程号
if (current->pid)
return -EPERM;
}
current->vfork_sem = &sem;
p = alloc_task_struct();
if (!p)
goto fork_out;
*p = *current;复制父进程的task_struct
retval = -EAGAIN;
if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur)该用户已经拥有的进程数量达到规定值
goto bad_fork_free;
atomic_inc(&p->user->__count);
atomic_inc(&p->user->processes);