1、进程的启动和终止
- 启动
1)内核通过shell等界面,用fork(2)生成子进程,然后用exec(3)族函数执行所指定的程序;
2)内核调用专门的启动例程,取得命令行参数及环境变量;
3)开始从main开始执行程序;
4)创建进程的函数还包括system(3)和popen(3)等;
- 终止
终止程序有5种正常的终止方式和3种异常的终止方式:
正常的终止方式:
1)从main中返回(调用了return语句或者执行到结束处);
2)调用了exit(3)函数;
3)调用了_exit(3)或者_Exit(3)函数;
4)最后一个线程从启动例程返回;
5)最后一个线程调用了pthread_exit(2)函数;
异常的终止方式:
1)调用了abort(3)函数;
2)捕捉到一个信号并被其终止;
3)最后一个线程对pthread_cancel(2)取消请求作出了响应;
从main函数返回可以采用以下方式:
1)显示地调用return,main函数从return处返回;
2)让main函数一直执行到末尾自动退出;
3)以上两种情况main函数都将隐式的调用exit函数(以0为终止状态)执行后续处理,也可以直接调用exit函数并赋以终止状态作为参数:
1 2 3 4 5 6 7 8 | #include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status); |
exit(3)在被调用时将首先执行相关的终止处理,可以用atexit(3)函数注册自定义的终止处理函数,exit(3)执行时将按最后注册最先执行的顺序依次执行它们:
1 2 3 | #include <stdlib.h> int atexit(void (*func)(void)); |
注意在使用atexit注册的终止处理函数无参数表和返回值;
_exit(2)和_Exit(2)是一样的,它们不会调用终止处理函数而是直接使进程终止;
关于进程的终止状态:
进程终止时将转为僵死状态,由父进程通过调用wait(2)收集其终止状态的方式在内核的进程表中解除注册。在bash shell下,可以通过命令"echoe $?"取得上一个程序执行结束后的终止状态;
- 如果进程从main函数的return语句返回,终止状态为main的返回值;
- 如果进程显式的从exit(3)、_exit(2)、_Exit(2)返回,终止状态为它们的参数;
- 如果进程结束时没有显式的调用返回语句,对于Linux,终止状态为所调用的最后一个有返回值的子函数的返回值;对于ISO C,main函数返回0。
- 若进程因捕捉到信号而终止,进程返回“128+信号值”;
- 没有遇到上述情况而从main函数处执行结束时,对于Linux,进程返回1;对于ISO C,main函数返回0;
- 显式的指定进程终止状态时常用两个宏常量表征进程执行成功或失败:EXIT_SUCCESS和EXIT_FAILURE;如:
1 2 3 4 | if (buf == NULL) { printf(“Buffer error!n”); exit(EXIT_FAILURE); } |



