Linux——进程控制

目录

进程创建

fork函数知识

fork函数返回值

写时拷贝

fork常规用法 

fork调用失败的原因 

进程终止

进程退出场景

进程退出码

进程正常退出

return退出

exit() 函数

_exit() 函数 

return、exit和_exit之间的区别与联系

进程异常退出

 进程等待

进程等待的必要性

获取子进程status

进程等待的方法

wait方法  

waitpid方法 

进程程序替换 

 替换原理

替换函数 

函数解释

命名理解

进程创建

fork函数知识

linux fork 函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
函数原型
#include <unistd.h>

pid_t fork(void);

返回值:自进程中返回0,父进程返回子进程id,出错返回-1

进程调用fork,当控制转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程。
  • 将父进程部分数据结构内容拷贝至子进程。
  • 添加子进程到系统进程列表当中。
  • fork返回,开始调度器调度。

 

当一个进程调用 fork 之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程,看如下程序

运行结果如下:

这里看到了三行输出,一行 before ,两行 after 。进程18820 先打印 before 消息,然后它有打印 after 。另一个 after 消息有18821 打印的。注意到进程18821 没有打印 before ,为什么呢?如下图所示

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意: fork之后,父进程和子进程谁先执行完全由调度器决定。

fork函数返回值

  • 父进程fork 函数返回子进程的进程ID(PID)。
  • 子进程fork 函数返回0。
  • 错误fork 函数返回-1,并设置 errno 以指示错误。

具体来说:

  • 如果 fork 成功,系统会在父进程和子进程中分别返回不同的值。
    • 在父进程中,fork 返回子进程的 PID,这是一个正整数。
    • 在子进程中,fork 返回 0。
  • 如果 fork 失败,则返回 -1,并且不会创建子进程。这通常是由于系统资源不足或达到进程限制等原因引起的。在这种情况下,可以使用 perrorstrerror 函数输出错误信息。

fork函数为什么要给子进程返回0,给父进程返回子进程的PID?

一个父进程可以创建多个子进程,而一个子进程只能有一个父进程。因此,对于子进程来说,父进程是不需要被标识的;而对于父进程来说,子进程是需要被标识的,因为父进程创建子进程的目的是让其执行任务的,父进程只有知道了子进程的PID才能很好的对该子进程指派任务。 

为什么fork函数有两个返回值? 

父进程调用fork函数后,为了创建子进程,fork函数内部将会进行一系列操作,包括创建子进程的进程控制块、创建子进程的进程地址空间、创建子进程对应的页表等等。子进程创建完毕后,操作系统还需要将子进程的进程控制块添加到系统进程列表当中,此时子进程便创建完毕了。

 也就是说,在fork函数内部执行return语句之前,子进程就已经创建完毕了,那么之后的return语句不仅父进程需要执行,子进程也同样需要执行,这就是fork函数有两个返回值的原因。

写时拷贝

写时拷贝(Copy-On-Write, COW)是一种优化技术,用于延迟或避免对共享资源的实际复制,直到需要对其进行修改时才执行复制操作。这种技术在进程创建和内存管理中非常常用,尤其是在操作系统实现 fork 函数时。

fork 与写时拷贝

当一个进程调用 fork 创建子进程时,操作系统会创建一个几乎完全相同的进程副本。这包括进程的地址空间、文件描述符等资源。使用写时拷贝技术,父进程和子进程最初共享同一块内存,而不是立即复制所有内存内容。只有在其中一个进程试图修改内存时,系统才会将相应的内存页复制,从而确保每个进程都有自己的内存副本。

这种方法极大地提高了 fork 的效率,尤其是在创建后不久就执行 exec(执行新程序)的场景,因为在这种情况下几乎不需要复制任何内存。

当子进程刚刚被创建时,子进程和父进程的数据和代码是共享的,即父子进程的代码和数据通过页表映射到物理内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值