exit , atexit , unatexit , _exit 或 _Exit 子例程
用途
终止进程。
库
标准 C 库 (libc.a)
语法
描述
退出 子例程在调用标准 I/O 库 清除 (_S) 函数以清空任何缓冲输出后终止调用进程。 此外,它调用先前通过 退出 子例程为进程注册的任何函数。 退出 子例程注册在正常进程终止时调用的函数以进行清除处理。 正常终止是由于调用 主 函数中的 退出 子例程或 返回 语句而发生的。
调用 退出 子例程寄存器的每个函数都必须返回。 此操作确保调用所有已注册的函数。
最后, 退出 子例程调用 退出 (_出口) 子例程,该子例程完成进程终止且不返回。 退出 (_出口) 子例程终止调用进程,并导致以下情况发生:
退出 (_E) 子例程在功能上等同于 退出 (_出口) 子例程。 退出 (_E) 子例程不调用向 退出 或任何已注册的信号处理程序注册的函数。 子例程的实现方式决定了是清空还是关闭打开的流,以及是否除去临时文件。 调用过程终止,后果如下。
- 在调用过程中打开的所有文件描述符,目录流,转换描述符和消息目录描述符都将关闭。
- 如果调用进程的父进程正在执行 等 或 等待标识,并且未将其 SA_NOCLDWAIT 标志或 SIGCHLD 设置为 SIG_IGN ,那么将通知它调用进程的终止,并且 状态 的低阶 8 位 (即 0377 位) 将提供给它。 如果父代未在等待,那么在父代随后执行 等 或 等待标识时,子代的状态可供其使用。
- 如果调用进程的父进程未执行 等 或 等待标识,并且既未设置其 SA_NOCLDWAIT 标志,也未将 SIGCHLD 设置为 SIG_IGN ,那么调用进程将变换为 zombie 进程。 zombie 进程是一个不活动进程,稍后当它的父进程执行 等 或 等待标识时将删除该进程。
- 终止进程不会直接终止其子进程。 在某些情况下,发送 SIGHUP 信号会间接终止子代。 这可以通过以下两种方式中的一种来实现。 如果实现支持 SIGCHLD 信号,那么 SIGCHLD 将被发送至父进程。 如果父进程已设置其 SA_NOCLDWAIT 标志,或者将 SIGCHLD 设置为 SIG_IGN ,那么状态将被废弃,并且调用进程的生存期将立即结束。 如果设置了 SA_NOCLDWAIT ,那么将定义是否将 SIGCHLD 信号发送至父进程的实现。
- 所有调用进程的现有子进程和 zombie 进程的父进程标识都设置为定义了实现的系统进程的进程标识。
- 每个连接的共享内存段都已拆离,并且与它的共享内存标识关联的数据结构中 什姆纳特奇 (请参阅 什姆 gget) 的值将减少 1。
- 对于调用过程已为其设置 塞马季 值的每个信号量 (请参阅 塞地布) ,该值将添加到指定信号量的 塞姆瓦尔 。
- 如果该过程是控制过程,则将 SIGHUP 信号发送到属于呼叫过程的控制终端的前台过程组中的每个过程。
- 如果该过程是控制过程,则与该会话相关联的控制终端与该会话解除关联,从而允许由新的控制过程获取该控制终端。
- 如果进程的退出导致进程组成为孤立进程组,并且如果新孤立进程组的任何成员已停止,那么将向新孤立进程组中的每个进程发送 SIGCONT 信号,后跟 SIGCONT 信号。
- 调用过程中所有已打开的指定信号都将关闭,就像通过对 sem_close的适当调用一样。
- 在该进程中创建的内存映射将在该进程被破坏之前取消映射。
- 在调用过程中映射的任何类型内存块都将取消映射,就像隐式调用了 蒙映射 子例程来取消映射一样。
- 调用进程中所有打开的消息队列描述符都已关闭。
- 可以取消任何未完成的可取消异步 I/O 操作。 那些未取消的异步 I/O 操作已完成,就像 退出 (_E) 子例程尚未发生一样,但任何关联的信号通知都被禁止。
退出 (_E) 子例程可能阻止等待此类 I/O 完成。 实现定义是否取消了任何 I/O ,以及在 退出 (_E)时可以取消哪个 I/O。
- 对 退出 (_E) 的调用所终止的线程不会调用其取消清除处理程序或每个线程数据析构函数。
- 如果调用进程是跟踪控制器进程,那么该调用进程创建的任何跟踪流都将关闭。
取消退出 子例程用来取消注册先前由 退出 子例程注册的函数。 如果找到了引用的函数,它将从在程序正常中止时所调用的函数的列表中被除去。
参数
| 项 | 描述 |
|---|---|
| 状态 | 指示该进程的状态。 可以设置为 0 , EXIT_SUCCESS , EXIT_FAILURE 或任何其他值,但只有最不重要的 8 位 8 正在等待的父进程。 |
| FUNCTION | 指定要在正常进程终止时调用以进行清除处理的函数。 您可以将多个函数指定为 ATEXIT_MAX 函数设置的限制,该限制在 sys/limits.h 文件中定义。 保持函数的下推堆栈,以便最后注册的函数是被调用的第一个函数。 |
返回值
成功完成后, 退出 子例程将返回值 0。 否则,返回非零值。 退出 和 退出 (_出口) 子例程不会返回一个值。
如果找到 功能 引用的函数并将其从 退出 列表中除去,那么 unatexit () 子例程将返回值 0。 否则,返回非零值。