进程学习:进程退出_exit()和exit()

本文探讨了_exit和exit函数之间的主要区别:前者不刷新缓存区而后者会刷新。通过一个简单的C程序示例展示了这两种函数在进程结束时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

_exit 和 exit 最大的区别在于后者在结束进程时会刷新缓存区,前者则不会刷新缓存区;

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, const char *argv[])
{
    pid_t pid;

    if( (pid = fork()) < 0)
    {
        perror("fork error");
        exit(1);
    }
    else if(pid == 0)
    {
        printf("hello world");
        exit(0);
        //_exit(0);
    }
    else if(pid > 0)
    {
        waitpid(pid, NULL, 0);

    }

    return 0;
}

我们分别调用exit与_exit函数,分别编译执行后如下:
exit:
这里写图片描述
输出了hello world。

_exit:
这里写图片描述
什么都没输出,直接结束。

这段代码 `using ::at_quick_exit;` 是 C++ 中用于引入全局命名空间 (`::`) 中的符号 `at_quick_exit` 到当前作用域中的声明。接下来我将详细介绍这个函数的作用用法。 ### `at_quick_exit` 函数介绍 - **功能**: - `std::at_quick_exit` 是一个标准库函数,允许用户注册一个或多个清理回调函数 (cleanup functions),这些函数会在程序调用 `std::quick_exit()` 时执行。 - **头文件**: - 此函数定义在 `<cstdlib>` 头文件中。 - **原型**: ```cpp std::add_function<void ()> at_quick_exit(std::function<void()> f); ``` - **行为说明**: - 当你调用了 `std::quick_exit()`, 所有的已注册给 `std::at_quick_exit` 的函数都会按照它们被加入顺序相反的方式依次被执行一次。也就是说最后一个添加进去的会最先运行。 - 注册的过程不会立即执行传递进来的函数对象;只有当真正发生快速退出(`quick_exit`)的时候才会触发那些已经登记过的任务。 - 如果有任何一个这样的处理器抛出了异常,则整个进程终止(`std::terminate`)。因此我们应该保证每个处理器都能够正常完成而不产生新的未捕获异常。 - **对比与差异** - 它类似于传统的 `std::atexit()` 功能但是有一个关键的不同点在于它是用来配合 `std::quick_exit` 使用而不是普通的 `_Exit`(POSIX)/`_exit`(Windows)系统调用或是正常的程序结束流程。 - 相较于普通关闭路径而言, 快速退出不会调用静态对象销毁子句,也不会做任何常规资源回收动作(如 flush I/O 缓冲区等),所以更适合需要紧急停止的情况。 ### 示例用途场景 这里提供一个小例子来演示其基本用法: ```cpp #include <iostream> #include <cstdlib> void cleanup_handler1(){ std::cout << "Cleanup handler 1 called.\n"; } int main(){ // Registering handlers for quick exit scenario. using ::at_quick_exit; at_quick_exit(cleanup_handler1); try{ throw std::runtime_error("Something went wrong!"); } catch(const std::exception& e){ std::cerr << "Error caught: " << e.what() << "\nPerforming a quick exit now...\n"; std::quick_exit(0); // This triggers the registered function(s). } return 0; } ``` 在这个简单的例子当中,我们首先使用了 `using ::at_quick_exit;` 来把来自全局命名空间内的 `at_quick_exit` 引进来以便后续可以直接引用而无需前缀限定符。接着我们在遇到错误之后选择不经过常规终止步骤而是直接采取快速退出机制,这时先前所绑定的那个清理处理就会得到调用输出对应的消息。 希望以上解释能够帮助您理解 `using ::at_quick_exit;` 这一行的意义及其背后涉及的概念!如果您还有疑问或其他方面想要深入了解的地方,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值