写时拷贝与进程控制详解

写时拷贝(Copy-on-Write)简介

  1. 减少创建时间:写时拷贝技术可以显著降低新进程创建时的耗时。
  2. 减少内存浪费:通过延迟实际拷贝数据,避免了不必要的内存占用。

进程退出与退出码

echo $?用于打印最近一个程序(进程)退出时的退出码。

    1. 0:表示成功退出
    2. 非零:表示失败

进程退出方式

  1. main return;
  2. exit();

退出时会刷新缓冲区_exit();

退出时不会刷新缓冲区

调用 exit(int number) 时,进程会立即退出,number 为退出码。

当进程出现异常时,通常是由于收到了信号导致退出。

进程等待机制

  1. wait():等待任意一个退出的子进程,解决僵尸进程问题
  2. waitpid():获取指定子进程的退出码,(status >> 8) & 0xFF
  3. 异常退出:退出码无意义

常用宏:

  1. WEXITSTATUS():获取退出码
  2. WIFEXITED():判断是否正常退出

非阻塞等待

父进程可以通过非阻塞轮询方式不断查询子进程状态,这样可以在等待的同时处理其他任务,实现资源的高效利用。

  1. 结果大于0:等待结束
  2. 等于0:调用结束,但子进程未退出
  3. 小于0:失败

exec* 系列接口详解(进程程序替换)

exec* 系列接口用于将当前进程的执行代码替换为新程序,不会创建新进程。

  1. 一旦替换成功,原进程的后续代码不会再执行。
  2. 替换失败时返回 -1。
  3. 这些接口不用接收返回值,一旦返回必然是失败。

常用接口说明

  1. execl(路径+程序名, ... , NULL)
    1. 传递参数方式类似命令行,必须以 NULL 结尾
    2. 适用于需要指定完整路径和参数的场景
  2. execlp(文件名, ... , NULL)                只需文件名,自动在 PATH 环境变量中查找命令
  3. execv(路径, 数组参数)                      参数以数组形式传递
  4. execvp(文件名, 数组参数)                自动查找 PATH,参数以数组传递
  5. execvpe(PATH, 数组参数)
  6. execve(文件名, 数组参数, 环境变量)这是系统调用,提供最底层的进程替换能力

以上6种是对 execve 的封装。

进程独立性通常结合子进程使用,父进程与子进程互不影响,体现了写时拷贝的独立性。

参数与环境变量

  1. 命令行参数表:用于向新程序传递启动参数
  2. 环境变量表:用于传递运行环境信息

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐