首页 > 系统相关 >linux中进程的创建和终止

linux中进程的创建和终止

时间:2024-10-02 21:12:05浏览次数:12  
标签:fork 文件 创建 进程 exit linux 终止 执行

进程的创建

fork

fork函数用来创建一个子进程

子进程获得父进程的栈、数据段、堆和执行文本段的拷贝

内存节约

需要注意的是,执行文本段其实就是代码段,这个段是父子进程共享的,换句话说,虚拟的进程空间各自有一份,但是指向的物理空间共享一份

还有,对于父进程数据段、堆段和栈段中的各页,内核采用写时复制的技术,简单来说,就是刚开始,父子进程指向的都是一样的,并没有复制,当子进程要修改时,内核才会对这些要修改的页进行拷贝,这个时候,对这些页的修改就不会影响对方了

这两种技术,都是为了节省空间,单纯的复制还是有点浪费了

2

文件共享

执行fork,子进程会获得父进程的文件描述符的副本,但是指向的文件是一样的,所以父子进程间共享文件偏移量和打开文件状态标志,换句话说,对文件的修改会通知对方

如果不想共享,可以使用以下两种办法

  • wait(),让父进程等待子进程结束后,在执行
  • 令父子进程使用不同的文件描述符,各自立即关闭不在使用的描述符

1

竞争条件

fork创建进程后,我们是没办法知道哪一个进程会优先执行,即获得cpu的使用权,这取决于操作系统的进程调度

可以使用信号量、文件锁等方法,不过一般来说是默认父进程为fork之后优先调度的对象

使用方法

fork返回值为-1,表示失败,返回值为0,表示是子进程,剩下的是父进程

  switch (fork()) {
    case -1:
      /* 失败 */
    case 0: 
      /* 子进程 */
    default:
      /* 父进程 */
  }

还有需要注意的是,父子进程的代码段最开始是一样的,然后都是从fork函数的返回点开始执行,也就是说他们都会进入case的情况,然后根据各自的fork的返回值进入不同的case内执行,如果中途没有退出,那么他们都会顺利执行完整个程序,这点很重要

vfork

vfork()因为如下两个特性而更具效率,这也是其与 fork()的区别所在。

无需为子进程复制虚拟内存页或页表。相反,子进程共享父进程的内存,直至其功执行了 exec()或是调用_exit()退出。

在子进程调用 exec()或_exit()之前,将暂停执行父进程。

vfork创建进程后,执行的顺序是确定的,只有等子进程结束,父进程才能执行

并且,vfork创建出的子进程是和父进程共享内存的,但仍存在一些情况,子进程的修改不会影响父进程,比如说对子进程的文件描述符进行操作(如果指向的是同一个打开文件句柄,那还是会有影响的),不过情况很少就对了

需要注意的是,尽管子进程也会有自己的文件流标,但是文件流对应着底层的一个或多个文件描述符,对文件流的操作可能会影响

wait

系统调用 wai(t &status)的目的有二:其一,如果子进程尚未调用 exit()止,那么 wait()会挂起父进程直至子进程终止;其二,子进程的终止状态通过 wait()的 status 参数返回。

execve

系统调用 execve(pathname,argv,envp)加载一个新程序(路径名为pathname,参数列表为 argv,环境变量列表为 envp)到当前进程的内存。这将丢弃现存的程文本段,并为新程序重新创建栈、数据段以及堆。通常将这一动作称为执行(execing)一个新程序。

进程的终止

_exit

_exit()的 status 参数定义了进程的终止状态(termination status),父进可调用 wait()以获取该状态。虽然将其定义为 int 类型,但仅有低 8 位可为父进程所用。按照惯例,终止状态为 0 表示进程“功成身退”,而非 0 值则表示进程因异常而退出。

  • EXIT_FAILURE 是1,表示非正常终止
  • EXIT_SUCCESS 是0,表示正常终止

需要注意的是_exit(-1)传递给父进程的状态码是255, 因为status仅有低8位有效,即0-255, -1会被视为补码形式

exit

exit()会执行的动作如下

  • 调用退出处理程序(通过 atexit()和 on_exit()注册的函数),其 执行顺序与册顺序相反 (就像是栈一样)
  • 刷新 stdio 流缓冲区。
  • 使用由 status 提供的值执行_exit()系统调用

程序的另一种终止方法是从 main()函数中返回(return),或者或明或暗地一直执行到main()函数的结尾处1。执行 return n 等同于执行对 exit(n)的调用,因为调用 main()的运行时函数会将 main()的返回值作为 exit()的参数。

退出处理程序

5

6

退出处理程序执行的顺序与注册顺序 相反

总结

3

不论程序是正常终止或者异常终止,内核都会执行多个清理步骤,包括关闭所有打开的文件描述符、文件流、目录流等等

标签:fork,文件,创建,进程,exit,linux,终止,执行
From: https://www.cnblogs.com/dylaris/p/18445063

相关文章

  • Apache POI 创建 Excel
    数据来自通义千问......
  • 【转戴】Redhat与Debian系介绍(Linux各种发行版本概述)
    Linux,最早由LinusBenedict Torvalds在1991年开始编写。在这之前,RichardStallman创建了FreeSoftwareFoundation(FSF)组织以及GNU项目,并不断的编写创建GNU程序(此类程序的许可方式均为GPL:GeneralPublicLicense)。在不断的有杰出的程序员和开发者加入到GNU组织中后,便造就了......
  • transaction_timeout:达到事务超时时终止会话
    功能实现背景说明我们已经有两个参数来控制长事务:statement_timeout和idle_in_transaction_session_timeout。但是,如果事务执行的命令足够短且不超过statement_timeout,并且命令之间的暂停时间适合idle_in_transaction_session_timeout,则事务可以无限期持续。在这种情况下,tra......
  • Linux删除多余内核
    Linux删除多余内核使用aptdist-upgrade升级系统后,有时会更新新的内核。我们可以把旧的内核删掉来释放磁盘空间。查看当前的内核信息#查看当前正在使用的内核uname-a#查看系统当中的所有内核aptlist*linux*--installed#或ls/lib/modules|wc-l#有多少个内核......
  • 关于Arch Linux 安装及一些相关问题总结
    关于个人ArchLinux安装及相关问题总结关于为什么ssj不得不使用Linux,就其根本地,是因为巨硬的Windows更新炸掉了ssj的蓝牙,Playing的时候只能接入两个设备,难绷0.其它记得在pacstrap前换国内的源不会有人和我一样没换等半天还不成功吧......
  • linux系统相关概念与配置
    一.本地服务器:几个相关软件(一)vmware关键字:虚拟机(搭建虚拟环境)(二)MobaXterm关键字:连接(三)123445![](https://img2024.cnblogs.com/blog/3530901/202410/3530901-20241002141002999-137920567.jpg)![](https://img2024.cnblogs.com/blog/3530901/202410/3530901-20241002141037......
  • 61_索引管理_快速上机动手实战创建、修改以及删除索引
    1、为什么我们要手动创建索引?2、创建索引创建索引的语法PUT/my_index{"settings":{...anysettings...},"mappings":{"type_one":{...anymappings...},"type_two":{...anymappings...},...}}创建索引的示例PUT/my_index{"se......
  • Arch Linux命令
    服务命令systemctlstartdoh-client.service#启动systemctlstatusdoh-client.service#查看状态systemctlrestartdoh-client.service#重新启动systemctlenable--nowdoh-client.service#允许开启启动systemctlis-enableddoh-client.service#查看是否开机时......
  • Linux 安装 docker-compose
    原文:linux安装docker-compose(官网教程)要在Linux上安装DockerCompose命令,可以按照以下步骤进行操作:下载DockerCompose的可执行文件。可以使用以下命令下载最新版本:sudocurl-L"https://github.com/docker/compose/releases/latest/download/docker-compose-$(un......
  • linux文件编程_进程
    1.进程相关概念面试中关于进程,应该会问的的几个问题:1.1.什么是程序,什么是进程,有什么区别?程序是静态的概念,比如:磁盘中生成的a.out文件,就叫做:程序进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程程序是静态的概念,进程是动态的概念简单的来说,没有......