exit函数使用说明

摘要:本文描述的是Linux手册页(3.73版本)中exit()函数的使用说明,使用exit()函数正常终止一个进程.原文来自:http://www.kernel.org/doc/man-pages/.
NAME
    exit - 正常终止一个程序
SYNOPSIS
    #include <stdlib.h>
    void exit(int status);
DESCRIPTION
    exit()函数用于正常终止一个进程,参数status&0377作为终止状态,返回给父进程.
    调用exit函数时,通过函数atexit或on_exit注册的所有函数(终止处理程序)都会被调用,且调用的顺序刚好与注册时候的顺序相反.(在这些终止处理程序中有可能是为了在程序终止时执行一个额外的处理.新注册的函数会被添加到注册队列的头部,然后等待被调用.)如果这些终止处理程序没有返回退出(比如:_exit函数或kill a signal),那么剩余的终止处理程序将不会被调用.exit函数也将被抛弃终止.如果同一个函数如若注册多次,则也会被调用多次.
    调用exit函数后,所有的IO流都会被关闭,由tmpfile创建的文件也会被移除.
    在C标准中设定了两个常量,EXIT_SUCCESS和EXIT_FAILURE,用来作为exit函数的参数,分别指出进程是正常退出还是异常终止.
RETURN VALUE
    exit函数没有返回值.
ATTRIBUTES
  多线程
    函数exit使用了一个不受保护的全局变量,所以它不是安全的线程.
CONFORMING TO
       SVr4, 4.3BSD, POSIX.1-2001, C89, C99.
NOTES
    如果终止处理函数调用了exit或longjmp函数,那发生的后果将是无法预知的.注意,调用execve函数将移除所有终止处理程序.
    相对于0和非0值,用EXIT_SUCCESS和EXIT_FAILURE更加简易明.特别的,VMS采用了不同的规定.
    BSD尝试将exit函数规范化.
    调用exit函数,退出进程后,终止状态必须要传递给父进程.这时,会发生三种情况:如果父进程设置了SA_NOCLDWAIT标志位(SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程.)    或者是将信号SIGCHLD交给SIG_IGN处理(当一个进程正常或异常终止时,内核就向父进程发送SIGCHLD信号,如果父进程不处理,交给SIG_IGN,则相当于父进程忽略子进程的生死.)子进程的终止状态会被抛弃.如果父进程正在等待取得子进程结束的终止状态.在这两种情况下,子进程将会马上终止,释放资源.如果一个已经终止,但父进程尚未对其进行善后处理的进程,被称之为僵死进程(进程已经终止,但是还没释放所占用的资源).所以父进程可以通过调用wait函数来等待处理退出的子进程.
    如果系统支持信号机制,可以通过信号传递给父进程,但是如果父进程设置了SA_NOCLDWAIT标志位,父进程将无法收到信号.
    如果进程是回话首进程且控制着一个控制终端,该进程终止后,该回话组的所有进程都会收到一个SIGHUP信号,同时终端也将会被释放,这些进程或终端可以加入到别的进程组.
    如果退出进程使得该组其他进程成为孤儿进程,这些孤儿进程将会终止,同时会接收到由信号处理程序SIGCONT发来的SIGHUP信号.
END

笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.

-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

### exit函数使用方法 在C语言中,`exit` 函数用于终止当前程序的执行,并可以选择性地返回一个状态码给调用者(通常是操作系统)。以下是关于 `exit` 函数的详细说明和正确使用方法: 1. **基本功能** 调用 `exit` 函数会立即终止程序的运行。它接受一个整型参数,该参数通常用来表示程序的退出状态。如果参数为 `0` 或 `EXIT_SUCCESS`,则表示程序成功结束;如果参数为 `EXIT_FAILURE`,则表示程序异常结束[^3]。 2. **清理工作** 在调用 `_exit` 进入内核之前,`exit` 会完成以下清理工作: - 执行用户通过 `atexit` 或 `on_exit` 注册的清理函数[^1]。 - 关闭所有打开的流,并将缓存中的数据写入目标文件或设备[^2]。 3. **示例代码** 下面是一个简单的示例,展示如何正确使用 `exit` 函数: ```c #include <stdio.h> #include <stdlib.h> void cleanup_function() { printf("Cleanup function called.\n"); } int main() { // 注册清理函数 atexit(cleanup_function); printf("Program is running.\n"); // 模拟错误情况并退出 if (1) { // 假设条件为真 printf("Error occurred, exiting program.\n"); exit(EXIT_FAILURE); // 使用 EXIT_FAILURE 表示失败 } printf("Program completed successfully.\n"); return EXIT_SUCCESS; // 等同于 exit(EXIT_SUCCESS) } ``` 在这个例子中,当程序遇到错误时,会调用 `exit(EXIT_FAILURE)` 终止程序,并确保注册的清理函数被调用。 4. **注意事项** - 如果需要立即终止程序而不执行任何清理操作,可以使用 `_exit` 函数,而不是 `exit`。 - 在多线程环境中,`exit` 会导致整个进程退出,而不仅仅是调用它的线程[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值