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.pswp.cn/diannao/83492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83492.shtml
英文地址,請注明出處:http://en.pswp.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系列)配置示例…