Linux——创建进程1

创建进程

在Linux中创建进程的方式:

  1. 在shell中执行命令或者可执行文件
    — 由shell进程调用fork函数创建子进程
  2. 在代码中(已经存在的进程中)调用fork函数创建子进程
    — 通过fork函数创建的进程为已经存在进程的子进程

在Linux系统中进程0(PID = 0)使用内核创建,其他所有进程都有服进程调用fork函数所创建的
Linux系统中的进程0在创建子进程(PID=1, init进程),进程0就转为交换进程或者空闲进程。
进程1(init进程)是系统中所有其他进程的共同祖先。

函数原型:
头文件:unistd.h
pid_t fork(void)
返回值:

  1. fork函数被正确调用后,将会在子进程中和父进程中分别返回!!!
    — 在子进程中返回值为0(不合法的PID,提示当前运行在子进程中)
    — 在父进程中返回值为子进程ID(让父进程掌握所创建子进程的ID号)
  2. 出错就返回-1

例子:
在这里插入图片描述
子进程的创建操作:
进程的资源其实包括内核空间资源和用户空间资源;那么我们创建子进程的操作其实就是分配内核空间资源和用户空间资源。

简单的来说,子进程是父进程的副本
— 子进程复制/拷贝父进程的PCB、数据空间(数据段、堆和栈)
— 父子进程共享正文段(只读)
子进程和父进程继续执行fork函数调用之后的代码
为了提高效率,fork后不并立即复制父进程数据段、堆和栈,采用了写时复制机制(Copy-On-Write)
— 当父子进程任意之一要修改数据段、堆、栈时 ,进行复制操作,并且仅复制修改区域.

父子进程的不同:
在这里插入图片描述
父子进程对共享文件的常见的处理方式:
1. 父进程等待子进程完成;当子进程终止后,文件当前位置已经得到了相应的更新。
2. 父子进程各自执行不同的程序段,各自关闭不需要的文件。
3. 父进程希望复制自己(共享代码,复制数据空间),但父子进程执行相同代码中的不同分支。
— 比如网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork创建子进程处理该请求,而父进程继续等待下一个服务请求到达.
4. 父子进程执行不同的可执行文件(父子进程具有完全不同的代码段额数据空间)
— 子进程从fork返回后,立即调用exec类函数执行另外一个可执行文件,




vfork函数:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值