exit耗时高

背景:程序退出发现被强制退出,而不是正常的退出。正常退出是发送15信号,而异常退出是发送信号9,强制退出。退出机制是先发送信号15,然后6s内没有退出完成,会发送信号9。通过查看退出流程,是将初始化申请的内存,资源全部释放掉。最后通过exit退出。通过加打印看到exit退出耗时高。去查看退出函数还有_exit退出耗时底。
原因是exit退出会先进入清理注册回调,刷新打开的文件缓冲区,关闭打开的文件描述符,最后调用_exit退出。_exit是直接退出。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>long long get_time_us() {struct timeval tv;gettimeofday(&tv, NULL);return tv.tv_sec * 1000000LL + tv.tv_usec;
}
// 清理函数
void cleanup() {printf("Cleanup function called.\n");
}// 测试 exit() 的耗时
void test_exit() {long long start;// 注册清理函数atexit(cleanup);printf("Testing exit()...\n");start = get_time_us();printf("This is a test for exit().\n"); // 输出到缓冲区fflush(stdout); // 确保缓冲区刷新exit(0); // 调用 exit(),会刷新缓冲区并执行清理
}// 测试 _exit() 的耗时
void test__exit() {long long start;printf("Testing _exit()...\n");start = get_time_us();printf("This is a test for _exit().\n"); // 输出到缓冲区_exit(0); // 调用 _exit(),不会刷新缓冲区,也不会执行清理
}int main() {pid_t pid;int status;long long start, end;// 测试 exit()printf("Starting exit() test...\n");start = get_time_us();pid = fork();if (pid == 0) {test_exit(); // 子进程调用 exit()} else {waitpid(pid, &status, 0); // 等待子进程退出end = get_time_us();printf("Time taken by exit(): %lld us\n", end - start);}// 测试 _exit()printf("Starting _exit() test...\n");start = get_time_us();pid = fork();if (pid == 0) {test__exit(); // 子进程调用 _exit()} else {waitpid(pid, &status, 0); // 等待子进程退出end = get_time_us();printf("Time taken by _exit(): %lld us\n", end - start);}return 0;
}/*
环境:https://www.onlinegdb.com/
Starting exit() test...
Testing exit()...
This is a test for exit().
Cleanup function called.
Time taken by exit(): 276 us
Starting _exit() test...
Testing _exit()...
This is a test for _exit().
Time taken by _exit(): 182 us`_exit()` 比 `exit()` 耗时低的原因在于它们的功能和执行过程不同:*/

_exit()exit() 耗时低的原因在于它们的功能和执行过程不同:


1. exit() 的行为

  • 清理工作
    • 调用所有通过 atexit() 注册的清理函数(如 cleanup())。
    • 刷新所有打开的文件缓冲区(确保缓冲区中的数据写入文件)。
    • 关闭所有打开的文件描述符。
  • 系统调用
    • 在完成上述清理工作后,exit() 最终会调用 _exit() 来终止进程。

由于 exit() 需要执行额外的清理工作,因此耗时更长。


2. _exit() 的行为

  • 直接终止
    • _exit() 是一个系统调用,它直接终止进程。
    • 不执行任何清理工作:
      • 不调用通过 atexit() 注册的清理函数。
      • 不刷新文件缓冲区。
      • 不关闭文件描述符。
  • 更快
    • 因为 _exit() 跳过了所有清理步骤,直接让操作系统回收资源,所以执行速度更快。

3. 实验结果分析

在您的实验中:

  • exit() 耗时:276 微秒。
  • _exit() 耗时:182 微秒。

这表明 exit() 的清理工作(如调用 cleanup() 和刷新缓冲区)增加了额外的时间开销。


4. 影响耗时的因素

以下因素可能会影响 exit()_exit() 的耗时差异:

  1. 清理函数的复杂度
    • 如果通过 atexit() 注册了多个清理函数,exit() 的耗时会进一步增加。
  2. 文件缓冲区大小
    • 如果有大量数据需要刷新到文件,exit() 的耗时会显著增加。
  3. 系统性能
    • 系统的 I/O 性能和进程管理效率也会影响耗时。

5. 总结

  • exit():因为它执行了清理工作(如调用清理函数和刷新缓冲区)。
  • _exit():因为它直接终止进程,跳过了所有清理步骤。
  • 在子进程中,通常推荐使用 _exit(),以避免重复清理父进程的资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令

docker compose 表示调用 Docker Compose 工具&#xff0c;用于管理基于 YAML 文件定义的多容器应用。 up 核心指令&#xff0c;作用是根据 docker-compose.yml 文件中的配置&#xff0c;创建并启动所有定义的服务、网络、卷等资源。 如果容器未创建&#xff0c;会先构建镜像&…

从辅助到协作:GitHub Copilot的进化之路

如果说现代程序员的标配工具除了VS Code、Stack Overflow之外&#xff0c;还有谁能入选&#xff0c;那一定是GitHub Copilot。从2021年首次亮相&#xff0c;到如今深度集成进开发者日常流程&#xff0c;这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了&#xff0c;而…

局部放大maya的视图HUD文字大小的方法

一、问题描述&#xff1a; 有网友问&#xff1a;有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗&#xff1f; 在 Maya 中&#xff0c;可以通过自定义 HUD&#xff08;Heads-Up Display&#xff09;元素的字体大小来局部放大特…

C++中隐式的类类型转换知识详解和注意事项

一、隐式转换的基本概念 隐式类型转换&#xff08;implicit conversion&#xff09;指编译器在需要时自动在两种类型之间插入转换代码&#xff0c;无需显式调用。对于内置类型&#xff08;如 int 到 double&#xff09;&#xff0c;转换由标准定义&#xff1b;对于用户自定义类…

【C++】18.二叉搜索树

由于map和set的底层是红黑树&#xff0c;同时后面要讲的AVL树(高度平衡二叉搜索树)&#xff0c;为了方便理解&#xff0c;我们先来讲解二叉搜索树&#xff0c;因为红黑树和AVL树都是在二叉搜索树的前提下实现的 在之前的C语言数据结构章节中&#xff0c;我们讲过二叉树&#x…

Leaflet使用SVG创建动态Legend

接前一篇文章&#xff0c;前一篇文章我们使用 SVG 创建了带有动态文字的图标&#xff0c;今天再看看怎样在地图上根据动态图标生成相关的legend&#xff0c;当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码&#xff0c;生成了一个 svg 节点&#xff0c;其中…

Linux基础开发工具二(gcc/g++,自动化构建makefile)

3. 编译器gcc/g 3.1 背景知识 1. 预处理&#xff08;进行宏替换/去注释/条件编译/头文件展开等) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 连接&#xff08;生成可执行文件或库文件) 3.2 gcc编译选项 格式 &#xff1a; gcc …

PostGIS实现栅格数据入库-raster2pgsql

raster2pgsql使用与最佳实践 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于将GDAL支持的栅格格式(如GeoTIFF、JPEG、PNG等)导入PostgreSQL数据库,支持批量加载、分块切片、创建空间索引及金字塔概览,是栅格数据入库的核心工具。 二、核心功能与典型用法 1…

精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈

精益数据分析&#xff08;64/126&#xff09;&#xff1a;移情阶段的用户触达策略——从社交平台到精准访谈 在创业的移情阶段&#xff0c;精准找到目标用户并开展深度访谈是验证需求的关键。今天&#xff0c;我们结合《精益数据分析》中的方法论&#xff0c;探讨如何利用Twit…

ORACLE RAC环境REDO日志量突然增加的分析

服务概述 CRM系统在7/11日出现REDO日志产生量突增&#xff0c;达到平时产生量的20倍以上&#xff0c;对数据同步已经造成了较大的影响。工程师接到故障申报后&#xff0c;及时进行响应&#xff0c;通过对相关日志等信息的深入分析&#xff0c;整理汇总此文档。 二、数据库REDO…

注册表设置windows背景护眼色

方法一&#xff1a; CtrlR&#xff0c;输入regedit打开注册表 HKEY_CURRENT_USER\Control Panel\Colors 右侧窗口Windows键值由255 255 255改为202 234 206。 方法二&#xff1a; 还是注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColo…

回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合

目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一…

自己手写tomcat项目

一&#xff1a;Servlet的原理 在Servlet(接口中)有&#xff1a; 1.init():初始化servlet 2.getServletConfig()&#xff1a;获取当前servlet的配置信息 3.service():服务器&#xff08;在HttpServlet中实现&#xff0c;目的是为了更好的匹配http的请求方式&#xff09; 4.g…

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化&#xff0c;服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论&#xff0c;在用户需求与技术边界之间找到最优解。 此次智能驾驶项目&#xff0c;我们为某车载平台提供…

ubuntu安装google chrome

更新系统 sudo apt update安装依赖 sudo apt install curl software-properties-common apt-transport-https ca-certificates -y导入 GPG key curl -fSsL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/google-chrom…

技术测评:小型单文件加密工具的功能解析

最近在测试一款名为OEMexe的文件加密工具&#xff0c;发现它确实有一些独特之处值得分享。这款软件体积非常小巧&#xff0c;仅209KB&#xff0c;属于绿色单文件版程序&#xff0c;无需安装即可直接运行。 主要特点 多格式支持&#xff1a;能够处理多种常见文件格式&#xff0…

Java-Objects类高效应用的全面指南

Java_Objects类高效应用的全面指南 前言一、Objects 类概述二、Objects 类的核心方法解析2.1 requireNonNull系列方法&#xff1a;空指针检查的利器2.2 equals方法&#xff1a;安全的对象比较2.3 hashCode方法&#xff1a;统一的哈希值生成2.4 toString方法&#xff1a;灵活的对…

计网| 网际控制报文协议(ICMP)

目录 网际控制报文协议&#xff08;ICMP&#xff09; 一、ICMP 基础特性 二、ICMP 报文分类及作用 差错报告报文 询问报文 网际控制报文协议&#xff08;ICMP&#xff09; ICMP&#xff08;Internet Control Message Protocol&#xff0c;网际控制报文协议&#xff09;是 …

微服务初步学习

系统架构演变过程 一、单体架构 前后端都在一个项目中&#xff0c;包括我们现在的前后端分离开发&#xff0c;都可以看作是一个单体项目。 二、集群架构 把一个服务部署多次&#xff0c;可以解决服务不够的问题&#xff0c;但是有些不必要的功能也跟着部署多次。 三、垂直架…

Web安全基础:深度解析与实战指南

一、Web安全体系架构的全面剖析 1.1 分层防御模型(Defense in Depth) 1.1.1 网络层防护 ​​防火墙技术​​: 状态检测防火墙(SPI):基于连接状态跟踪,阻断非法会话(如SYN Flood攻击)下一代防火墙(NGFW):集成IPS、AV、URL过滤(如Palo Alto PA-5400系列)配置示例…