一、进程执行的结果(重要)
1.进程正常执行,结果正确
2.进程正常执行,结果不正确(例如,文件打开失败等,没有继续执行后续代码,直接return)
3.进程没有正常执行(进程中断执行,直接报错,没有执行return语句 比如代码中含有 1/0 错误算法)
二、父进程如何知道子进程的执行结果
首先,我们都知道c语言中错误码的存在strerror(errno),我们执行下面代码,就可以获得各类错误码所代表的含义
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
for (int i = 0; i < 150; ++i)
{
printf("%s\n", strerror(i));
}
return 0;
}
(部分错误码展示)
思考:为什么main函数return的是0?
答案:0代表No error,也就是说main进程向他的父进程说明我的进程正常执行,结果正确
(1).子进程正常执行,结果正确
我们让进程退出,并告诉父进程 子进程错误码是0:No error 没有错误(我这里不直接说“return 0即可” 是因为进程退出不只return一种方式)
(2).子进程正常执行,结果不正确
我们让进程退出,并告诉父进程 子进程的对应错误码,比如当子进程打开文件失败 我们可以返回3:No such file or directory告诉父进程:子进程成功运行了,但是子进程没有完成他应完成的任务,返回的结果不正确
(3).进程没有正常执行
64种进程没有执行的原因:称为 进程终止信号
问题:为什么不从0开始标记呢?
答案:我们先思考这样一个逻辑:进程执行成功就意味着进程没有执行失败(doge.jpg),人话说就是有了错误码就不可能有1-64的各类终止信号,因此我们将此时的终止信号设置为0,表明进程正常执行了
总结:父进程通过两个数字知道子进程的执行结果:
通过终止信号知道进程有没有正常执行
通过错误码知道进程的执行结果
三、进程退出方式
1.return
喜闻乐见的正常退出 linux中可用 echo $? 查看上一次进程退出情况
2._exit
系统层面的函数接口,直接暴力退出一个进程,无论该进程正在做什么
3.exit
封装了_exit的函数接口,在调用_exit之前,还做了其他工作: 1. 执行用户通过 atexit或on_exit定义的清理函数。 2. 关闭所有打开的流,所有的缓存数据均被写入