做物流哪个网站推广好,wordpress批量替换代码,广告设计创意培训,lda模型 文本建模 wordpress文章目录 进程退出场景进程退出码strerrorerrno浅谈进程异常exit _exit 进程退出场景
代码运行完毕#xff0c;结果正确代码运行完毕#xff0c;结果不正确代码异常
进程退出码
我们写的C/C的代码#xff0c;main函数每次都需要返回0#xff0c;而这个return… 文章目录 进程退出场景进程退出码strerrorerrno浅谈进程异常exit _exit 进程退出场景
代码运行完毕结果正确代码运行完毕结果不正确代码异常
进程退出码
我们写的C/C的代码main函数每次都需要返回0而这个return 0就代表这进程的退出码表征进程运行结果是否正确通常0表示正确。
int main()
{printf(一个进程\n);return 0; //0-success
}这个退出码会被父进程(bash)接收我们可以使用指令echo $?拿到上一个进程的退出码在命令行中所以指令的父进程都是bash。 就好比谁会关心一个孩子的成长呢那肯定是他们的父母 而对应正确的退出码只有一个那就是0因为成功了并不会详细询问而运行结果不正确则需要返回对应的退出码告诉父进程是什么原因失败了。 例如我们考了班上的第一名家长会说儿子(小甜心)真棒走带你去吃好吃的 而我们如果考了倒数家长则会问为什么只考了这么点分是什么原因 所以这个main函数的返回值本质上表示进程运行完成时是否运行正确如果不正确就用不同的数字表示不同的错误原因。
strerror
不过这些数字的退出码是给计算机看的我们并不懂所以需要将这些退出码转换成对应的错误信息所以在Linux中有一个接口strerror将退出码转换成字符串。 #includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
int main()
{for(int i 0;i150;i){printf(%d: %s\n,i,strerror(i));}return 0; //进程的退出码表征进程的运行结果是否正确 0- success
}通过strerror接口我们就能查看到各个退出码所对应的信息。例如我们main函数返回的0。 其实本质上父进程接收退出码是为了给用户返回错误信息已便用户做出相应的措施
errno
C语言也提供了一个接口errno这里能返回最新一个错误码 #includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includeerrno.h
int main()
{char* ch (char*)malloc(1024*1024*1024*10);int ret 0;if(ch NULL) {printf(malloc error ,%d - %s\n,errno,strerror(errno));ret errno;}else{printf(malloc success\n);}return ret;
}浅谈进程异常
当进程退出异常的时候这时候的退出码意义并不是很大。 比如说在一场考试过程中有人作弊被抓到这时候他就属于考试异常那么他的这个成绩也就无关紧要了。 这时候对于老师或者家长就要知道这个异常的原因而不是考试的成绩 我们对指针的解引用操作或者进行除0操作都会导致程序异常这些都有对应的信号系统转给我们的进程让其退出
int main()
{int* p;*p 10; //对野指针解引用int a 1;a/0; //除0错误return 0;
}我们可以通过验证来发现但我们进程没有发生错误的时候我们主动给这个进程发信息来模拟这个除零错误 exit _exit
要终止一个进程我们可以使用C语言提供的接口exit在之前也见过但我们这个exit()括号里面的数字都不知道怎么填一般都填的-1有了本次知识的了解我们就能知道这个括号里面填的就是进程的退出码。 exit在**main函数**里面和return是等价的都可以返回进程的退出码 而在某个函数里面exit也是表示当前进程直接退出而return则指标是退出当前函数 使用exit在任何地方都表示进程退出而return只是在main函数里面表示进程退出 系统也提供了一个接口_exit它的功能也是直接终止进程参数和返回值和exit一样 exit和_exit的区别
此篇文章之前提到过关于缓冲区的概念不了解的可以先看一下此篇文章Linux进度条小程序_请揣满RMB的博客-CSDN博客
我们来看这4段代码的执行结果 运行发现调用exit退出进程会刷新缓冲区之后再终止进程而_exit是直接退出进程。
其实本质上exit在调用的时候会先执行用户定义的一些清理函数然后刷新缓冲区最后再调用_exitexit与_exit是一个调用与被调用的关系。 这里我们也可以得出一个结论缓冲区绝对不在内核区