结束进程
首先,我们回顾一下 C 语言中 continue, break, return 的作用:
continue: 结束本次循环
break: 跳出整个循环,或跳出 switch() 语句
return: 结束当前函数
而我们可以通过 exit() 或 _exit() 来结束当前进程。
所需头文件:
#include <stdlib.h>
void exit(int value);
功能:
结束调用此函数的进程。
参数:
status:返回给父进程的参数(低 8 位有效),至于这个参数是多少根据需要来填写。
返回值:
无
所需头文件:
#include <unistd.h>
void _exit(int value);
功能:
结束调用此函数的进程。
参数:
status:返回给父进程的参数(低 8 位有效),至于这个参数是多少根据需要来填写。
返回值:
无
exit() 和 _exit() 函数功能和用法是一样的,无非时所包含的头文件不一样,还有的区别就是:exit()属于标准库函数,_exit()属于系统调用函数。
下面的例子验证调用 exit() 函数,会刷新 I/O 缓冲区(关于缓冲区的更多详情,请看《浅谈标准I/O缓冲区》):
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char *argv[]){printf("hi, mike, you are so good"); // 打印,没有换行符"\n"exit(0);// 结束进程,标准库函数,刷新缓冲区,printf()的内容能打印出来// _exit(0); // 结束进程,系统调用函数,printf()的内容不会显示到屏幕while(1);// 不让程序结束return 0;}运行结果如下:
上面的例子,结束进程的时候改为调用 _exit(),代码如下:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char *argv[]){printf("hi, mike, you are so good"); // 打印,没有换行符"\n"//exit(0);// 结束进程,标准库函数,刷新缓冲区,printf()的内容能打印出来_exit(0); // 结束进程,系统调用函数,printf()的内容不会显示到屏幕while(1);// 不让程序结束return 0;}
printf() 的内容是不会显示出来的,运行结果如下:
接下来,我们一起验证一下结束函数( return )和结束进程( exit() )的区别。
测试代码如下:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>void fun(){sleep(2);return; // 结束 fun() 函数while(1);}int main(int argc, char *argv[]){fun();printf("after fun\n");while(1);// 不让程序结束return 0;}运行结果如下:
通过上面的运行结果得知,return 的作用只是结束调用 return 的所在函数,只要这个函数不是主函数( main() ),只要主函数没有结束,return 并不能结束进程。
我们将上面例子 fun() 里的 return 改为 exit():
#include <stdio.h>#include <stdlib.h>#include <unistd.h>void fun(){sleep(2);exit(0); // 结束当前进程while(1);}int main(int argc, char *argv[]){fun();printf("after fun\n");while(1);// 不让程序结束return 0;}exit() 是可以结束 fun() 所在的进程,即可让程序结束运行,结果图如下:
等待进程结束
当一个进程正常或异常终止时,内核就向其父进程发送 SIGCHLD 信号,相当于告诉父亲他哪个儿子挂了,而父进程可以通过wait() 或 waitpid() 函数等待子进程结束,获取子进程结束时的状态,同时回收他们的资源(相当于,父亲听听死去儿子的遗言同时好好安葬它)。
wait() 和 waitpid() 函数的功能一样,区别在于,wait() 函数会阻塞,waitpid() 可以设置不阻塞,waitpid() 还可以指定等待哪个子进程结束。
所需头文件:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:
等待任意一个子进程结束,如果任意一个子进程结束了,此函数会回收该子进程的资源。
其实,每个人都是幸福的。只是,你的幸福,常常在别人眼里。