进程有下面5种正常终止方式:
- 在main函数内执行return语句。这等效于调用exit。
- 调用exit函数。其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流等。
- 调用_exit或_Exit函数。其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O是否进行冲洗,这取决于实现。
- 进程的最后一个线程在其启动例程中执行返回语句。但是,该线程的返回值不会用作进程的返回值。当最后一个线程从其启动例程返回时,该进程以终止状态0返回。
- 进程的最后一个线程调用pthread_exit函数。在这种情况下,进程的终止状态总是0,这与传给pthread_exit的参数无关。
三种异常终止方式如下:
- 调用abort。它产生SIGABRT信号,这是下一种异常终止的一种特例。
- 当进程接收到某些信号时。
- 最后一个线程对“取消”请求做出响应。
不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。
我们都希望终止进程能够通知其父进程它是如何终止的。对于三个终止函数(exit、_exit、_Exit),实现这一点的方法是,将其退出状态(exit status)作为参数传送给函数。在异常终止情况下,内核(不是进程本身)产生一个指示其异常终止原因的终止状态(termination status)。在任意一种情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态。
对于父进程已经终止的所有进程,它们的父进程都改变为init进程。
在UNIX术语中,一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为僵死进程(zombie)。
一个由init进程领养的进程终止时不会变成一个僵死进程。因为无论何时只要有一个子进程终止,init就会调用一个wait函数取得其终止状态。