赞
踩
进程终止是进程控制里面的一个重要的知识,通过这一篇博客,我们可以学习到进程终止的概念,进程终止的三种情况,进程终止的退出码和退出信号,最后在来学习进程是如何进行终止的。
在计算机系统中,进程是操作系统分配资源的基本单位,而进程终止则是指操作系统因为某种原因结束一个进程的执行。这可能是因为进程完成了某种任务,也可能是因为出现了错误或异常。
创建一个进程的过程是:先创建一个内核的部分数据结构,再进行复制代码和数据。那么终止一个进程的过程是和创建一个进程的顺序是相反的,终止一个进程的本质是:释放曾经的代码和数据所占据的空间,释放内核数据结构。
echo内建命令的概念:打印的是bash内部的变量数据。
?符号的意义:父进程bash获取到最近一个子进程退出的退出码,0表示正常退出,非0表示异常退出。这个返回值需要让父进程得到,告诉父进程,子进程将任务完成的怎么样。
不是?符号可以将最近一个子进程退出的退出码获取吗?但是上图中为什么获取了两个不同的子进程退出的退出码。
因为echo命令也是一个进程,当使用完echo命令后,变成了最近一次子进程,又因为echo命令正常退出,所以最近一次子进程退出的退出码是0。
- #include <string.h>
- char* strerror(int errnum)
- // 返回值为char * 类型,指向描述错误错误的错误字符串的指针
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- int main()
- {
- int errcode = 0;
- for(errcode = 0; errcode <= 255; errcode++)
- {
- printf("%d %s\n", errcode, strerror(errcode));
- }
- return 100;
- }
因为父进程要知道子进程完成任务的情况(成功或者失败,失败的原因是什么),要对子进程进行负责。
我们可以通过联合体为自定义退出码进行赋值,将退出码置为全局变量,在每一个函数的每一种结果中都需要将退出码进行修改,在通过接收退出码的值将退出码的值翻译为错误信息的字符串。
- #include <stdio.h>
-
- enum{
- Success = 0,
- Div_Zero,
- Mod_Zero,
- };
-
- int errcode = Success;
-
- int Div(int a, int b)
- {
- if(b == 0)
- {
- errcode = Div_Zero;
- return -1;
- }
- else{
- errcode = Success;
- return a / b;
- }
- }
-
- char* geterror(int errno)
- {
- switch(errno)
- {
- case Success:
- return "Success";
- case Div_Zero:
- return "Div_Zero";
- case Mod_Zero:
- return "Mod_Zero";
- dafault:
- return NULL;
- }
- }
-
- int main()
- {
- int tmp1 = Div(10, 1);
- printf("answer: %d Error: %s\n", tmp1, geterror(errcode));
- int tmp2 = Div(10, 0);
- printf("answer: %d Error: %s\n", tmp2, geterror(errcode));
- return 0;
- }

最后一种情况:代码执行时,出现了异常,提前退出了,退出码没有意义。
我们可以使用kill命令来显示进程异常的退出信号所代表的含义:
kill -l
现在我们可以通过做个实验,来查看进程异常退出是否需要错误信号。
- #include <stdio.h>
- #include <unistd.h>
-
- int main()
- {
- while (1)
- {
- printf("I am process, pid = %d\n", getpid());
- sleep(1);
- }
- return 0;
- }
当代码中出现一些异常错误时,进程也会发出错误信号,杀死进程。
总结:判断一个进程的退出情况,我只需要检查进程是否出现异常;如果没有出现异常,就检查进程的退出码。衡量一个进程退出,我们只需要两个数字:退出码和退出信号。
我们可以通过代码来观察现象:
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
-
- int main()
- {
- printf("Hello world");
- exit(1);
- return 0;
- }
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
-
- int main()
- {
- printf("Hello world");
- _exit(1);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。