网站建设软件kan,南华网站建设,百度推广平台首页,单页展示网站文章目录 进程控制#xff08;一#xff09;进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制#xff08;一#xff09;
在前文中#xff0c;我们初步了解了进程的概念#xff0c;以及通过fork函数来创建子进程#xff0c;并对于为什么运行一个程序#xf… 文章目录 进程控制一进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制一
在前文中我们初步了解了进程的概念以及通过fork函数来创建子进程并对于为什么运行一个程序只要fork就会有两个进程分别执行不同的代码部分了解了父子进程公用同一代码以及数据。
下面我们进一步了解进程初步认识之后就要深入探讨如何对于控制进程。
进程终止 进程终止的方式有三种: 代码运行完毕结果正确代码运行完毕结果不正确代码异常终止程序 对于上述三种情况我们分别进行考虑总体上依据是否运行完毕分为两类运行正常以及运行异常终止。
运行正常
运行正常分为两种结果正确/结果不正确对于运行结果是否正确我们引入了退出码这一概念。
退出码
退出码是指在运行一个程序进程之后返回的一个int类型的数字比如main函数中我们常用的return 0表示的就是返回00即为退出码表示该程序结果运行正常结果正确其他数字表示结果不正确退出码是正整数。
正常终止进程 从main函数通过return返回调用exit调用_exit exit函数
exit函数的调用可以使得进程直接终止并返回其参数使用格式为exit(int)
echo $?可以得到最近一次进程的退出码
status 定义了进程的终止状态父进程通过wait来获取该值
//exit函数
//#includeunistd.h 在unistd.h库中
//void exit(int status); 其中status表示状态码状态码有八位可以被父进程所使用如执行exit(-1)
//echo $? 得到结果为255
#includeunistd.h
#includeiostream
using namespace std;
void func()
{cout Hello World! endl;exit(1);//此时结束func函数返回到main函数cout Hello World! endl;
}
int main()
{func();return 0;
}//main函数和func函数运行实际上可以认为是两个进程在运行main好比是func函数的父进程func通过exit终止程序返回码为1交给main函数_exit函数
_exit函数和exit函数的差别不大exit的执行最终也会调用_exit在此之前先执行以下几个方面
执行用户定义的清理函数冲刷缓冲区关闭流执行_exit函数 上述内容说明_exit为系统调用接口是直接对于操作系统内核进行操作不会冲刷缓冲区说明缓冲区一定不在内核中不然_exit也会冲刷缓冲区。 return
return是最为常见的一种退出进程的方法执行return n相当于exit(n)main函数执行完毕后会将返回值作为exit的参数退出进程。
#includeiostream
using namespace std;int main()
{//执行程序之后运行到下面阶段return 0;//返回00为退出码表示结果正常
}如果是我们自己为了做题或者学习的话退出码不需要处理那就任意退出码都可以当在项目中我们需要使用到父子进程时在子进程结束后进入僵尸状态Z需要父进程来接收子进程的信息其中就有退出码用来表示程序是否正常运行。main函数的返回值本质上是指进程运行完成时是否是正确的结果如果不是可以使用不同的数字来表示不同的出错码。 **main函数return返回说明进程正常终止这也是为什么在初学c/c时main函数默认return 0 **
运行异常
运行异常表现为进程在运行时崩溃中途终止进程显示异常信息如除零异常没有查找到文件异常 比如使用cat func命令如果当前目录下没有func目录或者文件会显示异常 上图表示为没有找到func文件或者目录这是一种异常信息
对于进程的终止如何杀死进程我们了解kill -9九号信号来进行杀死进程来控制进程所以我们可以知道实际上进程异常是运行程序后检测到异常然后操作系统通过kill命令发射相应的信号来显示报错信息以及结束进程。
通过kill -l命令可以显示所有信号 进程正常/异常总结 进程正常运行会有两种情况结果正确/不正确正确结果不用管但是为什么会出现不正确的结果又如何去知道不正确的原因呢通过退出码的形式来表示结果正确/不正确0表示结果正确其他数字表示为结果不正确不同数字对应不同的错误信息错误原因代码终止即代码异常本质上是代码并没有跑完中途崩溃那么这样就不会经过退出码直接就崩溃了如何显示异常信息呢异常就不会有退出码也就是说如果程序异常就不需要考虑退出码且异常的本质是进程收到了对应的信号在kill -l命令中我们可以看到所有的信息进程异常会将对应的信号存储下来供父进程接收。 上述提到的退出码以及异常信号都会作为信息被父进程回收处理。
退出码在系统中有对应的一套体系通过strerror(int)函数来得到对应退出码表示的信息
#includeiostream
using namespace std;
#includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
int main()
{//模拟实现错误信息的输出for(int i0;i200;i){printf(%d: %s\n,i,strerror(i));}return 0;
}