当前位置:   article > 正文

[Linux](9)进程控制:进程创建,进程终止,进程等待,进程程序替换_进程控制创建进程command>

进程控制创建进程command>

fork函数

简介

在Linux中,fork是非常重要的函数。它从已经存在的进程中创建一个新的进程,新进程为子进程,原进程为父进程。

头文件:<unistd.h>

pid_t fork(void);
  • 1

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

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

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

写时拷贝

fork之前父进程独立执行,fork之后,父子两个执行流分别执行,两个进程共享同一份代码。写时拷贝写入时进行深拷贝)确保了数据的独立。

❓为什么不在创建子进程的时候就重新开辟空间把数据分开,而要写时拷贝?(写时拷贝的优点)

  1. 对于不用修改的数据,两个进程只需要共用一份就够了。至于数据要不要修改,那就到修改时再说(写时)。
  2. 父进程的数据,子进程不一定全部修改,创建进程时就拷贝会浪费时间和空间。(写时拷贝提高内存管理效率)

fork常规用法

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段,例如:父进程等待客户端的请求,生成子进程来处理请求。
  • 一个进程要执行一个不同的程序,例如:子进程从 fork 返回后,调用 exec 函数

fork调用失败的原因

  • 系统中有太多的进程
  • 实际用户的进程数超过了限制

进程终止

关于终止的正确认识

这里首先提出两个问题:

  1. C/C++main 函数 return 0,是给谁 return
  2. 为什么 return 0return 其他值可以吗?

进程代码跑完,结果是否正确:正确 return 0,错误应该 return 非零,非零的值不同,表示不同的失败原因。这个非零的值又叫做进程退出码。它表征了进程的退出信息,是需要让父进程读取的(return 给了父进程)。

验证:

写一段代码直接返回一个非零值。

#include <stdio.h>
int main()
{
    return 123;
}
  • 1
  • 2
  • 3
  • 4
  • 5
[CegghnnoR@VM-4-13-centos 2022_8_16]$ ./mytest
[CegghnnoR@VM-4-13-centos 2022_8_16]$ echo $?
123
[CegghnnoR@VM-4-13-centos 2022_8_16]$ echo $?
0
  • 1
  • 2
  • 3
  • 4
  • 5

运行后 echo $?$? 表示在 bash 中,最近一次执行完毕时,对应进程的退出码。再 echo 一次就变成 0 了。

在使用指令时,也可以通过 echo $? 查看返回值:

[CegghnnoR@VM-4-13-centos 2022_8_16]$ ls
makefile  mytest  mytest.c
[CegghnnoR@VM-4-13-centos 2022_8_16]$ echo $?
0
[CegghnnoR@VM-4-13-centos 2022_8_16]$ ls abc
ls: cannot access abc: No such file or directory
[CegghnnoR@VM-4-13-centos 2022_8_16]$ echo $?
2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/578203
推荐阅读
相关标签