方式区别 | return | exit | _exit/_EXIT |
---|---|---|---|
是否刷新标准IO缓存 | 是 | 是 | 否 |
是否调用终止函数 | 是 | 是 | 否 |
其实可以这样进行理解一下,就是在标准库函数中的退出其实就是在系统调用的基础之上,加上了一层缓存机制,而事实上也确实是这样。所有的标准库函调用其实都是在系统调用的基础上再次封装形成的
下面通过一个代码的形式演示一下:
#include<unistd.h>#include<fcntl.h>#include<stdlib.h>#include<stdio.h>#include<string.h>void term_fun1(void){ PRintf("first term function/n");}void term_fun2(void){ printf("second term function/n");}void term_func3(void){ printf("third term function/n");}int main(int argc,char *argv[]){ char buffer[1024]= "helloworld/n"; if(argc < 2){ printf("缺少参数/n"); exit(EXIT_FAILURE); } //等级进程结束的相关函数,如果进程被终止,则会调用注册的相关函数,注意函数是以栈的形式进行存储,也就是先注册后调用 //如在进程结束后,调用的先后顺序为term_func3,term_fun2,term_fun1 atexit(term_fun1); atexit(term_fun2); atexit(term_func3); FILE * file_pointer = fopen(argv[1],"w+"); if(file_pointer != NULL){ fprintf(file_pointer,buffer); //全缓存形式进行写 }else{ printf("open file error/n"); exit(0); } if(!strcmp(argv[2],"return")){ //如果匹配到return的时候,是默认会刷缓存的 return 0; }else if(!strcmp(argv[2],"exit")){ //也会默认将缓存中的东西刷到文件中 exit(0); }else if(!strcmp(argv[2],"_exit")){ //默认不会进行刷缓存的操作,是内核提供的进行终止函数 //_EXIT(0); _exit(0); }else{ printf("正常退出/n"); } fclose(file_pointer); file_pointer = NULL; return 0;}这里的testCode是可以直接进行run的,有兴趣的可以拿过去简单跑一下,就会发现其中哪一个函数可以刷缓存,哪一个不能刷缓存,在这里就不多做解释了
关于这些命令还是简单演示一下吧: 使用ps命令
使用ps -ef | more命令
使用ps -aux| more命令
从上面几张图中其实可以看到很大的差别,就是ps -aux | more显示出来的信息相对更加全面一点
进程的几种状态主要包括了:
进程创建进程就绪进程运行进程阻塞(等待)进程结束
简单通过一张图来展示一下其相互关系:
从上面的图示中我们可以看到整个状态之间的转换图,分成了创建,就绪,运行,阻塞,以及退出这几种状态,而如果真正的细分进程的状态的话,其可以划分成更多的类型状态。在这里就不去细说了。有兴趣的童鞋可以查查。
谢谢大家的观看。这已经是第二遍了。手贱,之前写的被删掉了,结果找不回来了。这些都是关于进程的一些简单了解和介绍。在后面会更深入的了解怎么创建进程,进程调度策略等。
谢谢观看。
欢迎持续访问博客
新闻热点
疑难解答