进程的控制:结束进程、等待进程结束

结束进程

首先,我们回顾一下 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);

功能:

等待任意一个子进程结束,如果任意一个子进程结束了,此函数会回收该子进程的资源。

其实,每个人都是幸福的。只是,你的幸福,常常在别人眼里。

进程的控制:结束进程、等待进程结束

相关文章:

你感兴趣的文章:

标签云: