copy_process

本文详细介绍了Linux系统中进程创建的具体步骤,包括clone标志检查、进程结构复制、资源限制验证、模块计数更新、子进程PID处理等内容。通过这些步骤,读者可以深入了解Linux内核如何管理和创建新的进程。

1. 检查clone标志:

不能同时设NEWNS, FS

不能设THREAD, 但未设SIGHAND

不能设SIGHAND,但未设VM

 

2. 调用dup_task_struct()为子进程获取task_struct, thread_info结构

atomic_set(&tsk->usage,2);

 

3. 检查用户进程数

    if (atomic_read(&p->user->processes) >=
            p->signal->rlim[RLIMIT_NPROC].rlim_cur) {
        if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
                p->user != &root_user)
            goto bad_fork_free;
    }

 

4.增加module执行域(必须包含在内核模块中)的count

if (!try_module_get(p->thread_info->exec_domain->module))

    if (p->binfmt && !try_module_get(p->binfmt->module))

 

5. 保存clone flgs 和 pid

 

6. 如果SETID被设置, copy子进程pid到父进程的tidptr字段

    if (clone_flags & CLONE_PARENT_SETTID)
        if (put_user(p->pid, parent_tidptr))

 

7. 初始化进程描述符的list_head, 自旋锁, 挂起信号, 定时器及时间统计表等

 

8. copy描述符的各个字段

 

9. 调用copy_thread, 初始化内核栈, i/o位图

 

10. 调用sched_fork对新进程调度程序数据结构的初始化。 把新进程的状态设为TASK_RUNNING. 并设置preempt_count字段为1, 从而禁止内核抢占。父子进程共享时间片

 

11. 初始化亲子关系

 

12. 调用attach_pid把新进程描述符的pid插入pidhash散列表

 

13. (CLONE_THREAD被清0, 表示创建领头进程)

 

14. 返回子进程描述符指针

 

 

 

系统调用返回给子进程的是0, 返回给父进程的是子进程的pid

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值