方式区别 | 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显示出来的信息相对更加全面一点
关于其中的显示的信息 USER 用户属主 UID 用户ID PID 进程ID STIME 启动时间 PPID 进程父进程ID CPU CPU占用的资源 MEM 内存占用 NI 进程的NICE数值,越大,表示较少占用cpu的时间 VSZ 进程虚拟大小 rss 驻留中页的多少 TTY 终端类型 STAT 当前的状态R(runing运行状态),S(等待状态),T(终止状态),Z(僵尸状态) START 启动进程的时间 TIME 运行进程所花费的时间 COMMAND 执行命令进程的几种状态主要包括了:
进程创建进程就绪进程运行进程阻塞(等待)进程结束
简单通过一张图来展示一下其相互关系:
从上面的图示中我们可以看到整个状态之间的转换图,分成了创建,就绪,运行,阻塞,以及退出这几种状态,而如果真正的细分进程的状态的话,其可以划分成更多的类型状态。在这里就不去细说了。有兴趣的童鞋可以查查。
谢谢大家的观看。这已经是第二遍了。手贱,之前写的被删掉了,结果找不回来了。这些都是关于进程的一些简单了解和介绍。在后面会更深入的了解怎么创建进程,进程调度策略等。
谢谢观看。
欢迎持续访问博客
新闻热点
疑难解答