进程控制之进程终止

目录

 

1 进程终止时,操作系统做了什么工作?

2 进程终止的常见方式

3 用代码如何终止一个进程? 

1 return语句

2 exit 引起正常进程终止

操作系统终止进程_exit


 

1 进程终止时,操作系统做了什么工作?

从进程创建来理解:进程创建本质上就是创建出对应的内核数据结构和数据,并且通过映射关系映射到物理内存中。那么进程终止就要释放进程申请相关的内核数据结构和物理内存中对应的代码和数据。

本质:就是释放系统资源。

2 进程终止的常见方式

  • 代码跑完 结果正确-》编译c语言的helloworld程序。当代码跑完结果正确,进程就终止了。
  • 代码跑完 结果不正确-》运行时错误,比如逻辑有问题,程序没有达到我预计的结果。
  • 代码没跑完 程序崩溃了-》野指针 越界 直接崩溃了

对于前两种切入点:main函数的返回值。

编写C语言的时候,返回一个整数,并且是0,就是我们平时写的 return 0;

那么这个语句的含义是啥?有什么意义?内部是什么原理?为什么总是0?

main函数返回值-》进程的退出码。

退出码其实是子进程正常执行完这个程序,跑完了代码之后,不管运行结果正确与否,都将结果返还给她的父进程。

我们可以运行一个程序,观察一下,其实只有这一个进程运行的话,他的父进程是-bash。

写一个hello world的代码并且make来运行它。我们可以用echo $?来观看这个进程的退出码。

当我们正常运行这个程序,这个程序正常结束并且达到预期结果的时候,我们发现,进程的退出码是0。

当我们再次打印进程退出码的时候,打印的就是ench $?这条语句执行之后形成的进程得到的退出码了。所以其实仍然会显示0。

但是实际上,main函数的返回值他并不一定总是0,也可以是其他值。

只不过当进程的退出码是0的时候,标识这个进程是正常跑完,正常运行得到正确的结果的。但是非零则表示出现了各种错误。实际上,我们更关心的是这个程序如果运行出错,为什么会出错,也就是这个进程退出码代表的意思是什么。方便上层定位错误细节。但是退出码是计算机为了方便返回来设定的,对于的错误码,我们无法阅读,因此我们需要转换,将对应的错误码转换成字符串的方式。OS提供了strerror这个函数,可以将对应的进程退出码转换成对应的字符串,让我们来理解这个程序的错误。当然了,我们也可以自己设置进程的退出码。

strerror函数的使用等。

接下来演示如何用strerror来理解进程退出码的各个意思。

 

我们平时return语句也不能乱写,要让他具备一定的意义。

我们平时写的程序,不关心进程退出码,因为我们写的一般是单进程的程序,进程码返回给上一次进程,用来判断该进程结束的结果正确与否,可以忽略。

但是实际上,main函数也是一个对应的函数,他会有自己的对应的退出码。如果我们需要获得退出码来判断自己的结果运行是否正确,这种情况下就要关注进程的退出码了。

比如这个,就可以自己设置main函数的退出码,如果求和函数不正确,那么退出码就会被设置成其他的。退出码是可以自己设计的。如果我们有需要,可以自己设置一套退出码来标识各种错误信息。

对于第三种进程终止状态;

此时也会有退出码的,此时的退出码有意义吗?

一个程序崩溃了,他后续的结果就没有任何意义了。所以,程序崩溃的时候,退出码无意义。因为跟退出码对应的return语句没有被执行。

总结:三种进程终止结果,在程序的角度,不管结果对不对,都已经是一个二进制文件了。在linux文件下,只要是成功跑出来的都是0;如果跑完了,但是失败了,退出码就是其他的错误码了。

3 用代码如何终止一个进程? 

该怎么正确的退出?

1 return语句

 他只能用在main函数内部,return语句就是终止进程的,后跟着进程退出码。

注意:在其它函数内部不是的,其它函数标识这个函数结束,只有main函数内部才表示进程的退出。

2 exit 引起正常进程终止

观察一下这个exit

exit在任何地方都可以调用,都直接标识终止进程。

比如这个,就在sum的时候已经返回了1

 

所以return与exit的差别:

1 return是语句,exit是函数

2 return语句只用在main函数内部,才表示进程结束 ;若用在其它函数内部,仅仅是结束函数。

3 exit 任意位置都可以结束进程。

操作系统终止进程_exit

它对应的是一个系统调用接口 与exit的差别

也可以终止进程,它的返回值和参数与exit差不多。但是_exit是一个系统调用,他直接让操作系统去终止进程,无关于缓冲区。解释一下:

我们正常写程序的时候,如果有\n,那么所写的内容就会直接被刷新出来。但是如果没有的话,就会被放在缓冲区。用exit和_exit来执行程序退出。我们可以发现,exit他会将对应缓冲区的内容刷新出来之后,才退出进程,但是_exit是直接退出进程的。

因为他们两个是不同层面的东西。_exit是一个系统调用接口,exit是一个库函数。缓冲区不是在内核层面被维护着的,而是被C标准库来维护的。因此调用_exit,缓冲区的内容不会被刷新。

\n是用来刷新缓冲区的,当没有\n的时候,调用exit会去自动刷新缓冲区,那么里面的内容是可以被打印出来的。但是如果调用_exit的话就不行了。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值