(1)return
(2)exit
(3)_exit和_Exit
(4)进程的最后一个线程使用return
(5)进程的最后一个线程使用phread_exit
2、一个异常进程结束:
(1)abort
(2)signal
(3)cancellation request ,最后一个线程被取消
3、当一个进程结束时,它的父进程需要知道它是如何结束的,于是需要得到子进程的termination status,parent process可以通过wait 和waitpid两个函数得到。
(1)当parent process 先于child process结束
init process(ID is 1)接手它的child process,kernel搜索所有的进程,看看结束的进程是否是正在运行的进程的父进程,如果是,则将它们的父进程改为init process。
(2)子进程先于父进程结束
kernle保留了所有将要结束的进程的信息,如:process ID,termnation status,a mount of CPU time,这样的话,parent process可以通过wait和waitpid得到termination status。
(3)当一个进程的父进程变成init process时,发生了什么?
无论何时child process结束,init调用wait函数得到termination status。init进程总是可以获得子进程的终止状态。
4、wait和waitpid
(1)当调用这两个函数时,可能发生三种情况:
(1)block——如果它的子进程全部都在运行。
(2)立即返回child process的termination status——如果有子进程终止。
(3)返回error——如果没有子进程。
# include <sys/wait.h>
pid_t wait (int *statloc);
pid_t waitpid (pid_t pid, int *statloc, int options);
(2)两者的区别
(1)wait可能阻塞caller直到一个子进程终止,而waitpid则可以通过选项不会阻塞。
(2)waitpid并不等待第一个终止的进程,它有选项可以控制它所等待的进程。
(3)对于得到的ternimation status我们可以通过四个macos来区分:
(1)WIFEXITED(status) //正常终止
(2)WIFSIGNALED(status) //异常终止,获取异常信号
(3)WIFSTOPPED(status)
(4)WIFCONTINUED(status)
(4)waitpid根据pid的不同来获取不同的进程termination status。
(1)waitpid可以wait某个特定的process,而wait则是任何的terminated child
(2)waitpid是nonblockling //可以使用选项控制为非阻塞
(3)waitpid支持WUNTRACED和WCONTINUED //waitpid支持任务控制