」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 Sigaction 函式在 C++ 中優雅地處理 Ctrl-C 中斷?

如何使用 Sigaction 函式在 C++ 中優雅地處理 Ctrl-C 中斷?

發佈於2024-11-17
瀏覽:974

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

Intercepting Ctrl-C Events in C

捕捉Ctrl-C 事件是編程中的必要任務,尤其是在您希望對意外中斷做出優雅回應的情況下。

使用 Sigaction

在 C 中,使用 sigaction 函數來處理訊號更可靠。其文法如下:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

其中:

  • signum:要處理的訊號的編號,對於Ctrl-C,為SIGINT。
  • act:指定新訊號處理程序的動作。
  • oldact:儲存先前的行為。

在 Thomas 給出的範例中,sigaction 架構如下:

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;

其中:

  • sa_handler:指向處理程序函數。
  • sa_mask:要阻止處理此訊號期間的訊號遮罩。
  • sa_flags:附加標誌,通常為 0。

將此sigaction 結構與SIGINT 訊號一起使用:

sigaction(SIGINT, &sigIntHandler, NULL);

處理程序函數

最後,您需要一個處理程序函數來回應訊號。在範例中,my_handler 僅列印一則訊息並退出程式:

void my_handler(int s){
   printf("Caught signal %d\n", s);
   exit(1);
}

完整程式碼

以下是使用 sigaction 用來捕捉 Ctrl-C 事件的完整程式碼:

#include 
#include 
#include 
#include 

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}

透過使用 sigaction,您可以可靠地捕捉 Ctrl-C 事件並採取適當的措施。

最新教學 更多>
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-17
  • 為什麼 ASAP (Atlassian) Auth 是 REST API 驗證的快速且安全的選擇?
    為什麼 ASAP (Atlassian) Auth 是 REST API 驗證的快速且安全的選擇?
    作为一名广泛使用 API 的高级开发人员,安全性和效率始终是重中之重。在保护 REST API 方面,有多种身份验证方法可用,但并非所有方法都是相同的。 Atlassian 的 ASAP(服务和项目身份验证)Auth 作为一个强大、可扩展且安全的选项而脱颖而出,特别是在处理需要强大身份验证机制的...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17
  • Flexbox、Box 或 Flexbox:您應該使用哪種顯示屬性?
    Flexbox、Box 或 Flexbox:您應該使用哪種顯示屬性?
    靈活盒子模型:顯示:Flex、Box、Flexbox在 CSS3 領域,靈活盒子模型徹底改變了方式我們佈局元素。然而,豐富的顯示屬性值可能會令人困惑。 display: flex、display: box 和 display: flexbox 有什麼差別? Display: BoxFirefox 2...
    程式設計 發佈於2024-11-17
  • 如何在不使用 Python 的情況下使用 C++ 計算複雜的數學表達式?
    如何在不使用 Python 的情況下使用 C++ 計算複雜的數學表達式?
    如何在不整合Python 的情況下評估C 中的自訂數學表達式在沒有外部庫或運行時環境的情況下評估C 中的複雜數學表達式可能具有挑戰性。然而,ExprTk 庫提供了一個優雅且高效的解決方案。 讓我們考慮一個範例表達式:3 sqrt(5) pow(3, 2) log(5)使用ExprTk,我...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • API 設計中 HTTP 狀態碼的終極參考
    API 設計中 HTTP 狀態碼的終極參考
    在 Web 开发和 API 设计领域,HTTP 状态代码在客户端和服务器之间传达请求结果方面发挥着至关重要的作用。这些代码提供了一种标准化的方式来指示在处理 HTTP 请求期间发生的特定条件、成功或错误。了解这些状态代码对于开发人员至关重要,因为它有助于调试、错误处理和创建更强大的应用程序。 ...
    程式設計 發佈於2024-11-17
  • gRPC 和 Go:建立高效能 Web 服務
    gRPC 和 Go:建立高效能 Web 服務
    介紹 在微服務和分散式系統的世界中,服務之間的高效通訊至關重要。這就是 Google 開發的高效能 RPC(遠端過程呼叫)框架 gRPC 發揮作用的地方。與 Go(一種專為簡單和高效而設計的靜態類型編譯程式語言)相結合,gRPC 可以幫助您建立強大且可擴展的 Web 服務。 ...
    程式設計 發佈於2024-11-17
  • 如何使用 Spring 在 Hibernate 4 中定義與註解的關係?
    如何使用 Spring 在 Hibernate 4 中定義與註解的關係?
    使用Spring 在Hibernate 4 中使用註解定義關係要在Hibernate 4 中為提供的類別Foo 使用註解實現各種類型的關係和Bar,讓我們深入研究一下具體情況。 一對多單向關係:使用@OneToMany註解和List屬性。保持 Bar 類別不變。這建立了一對多關係,其中 Foo 可以...
    程式設計 發佈於2024-11-17
  • 如何在 Python 中即時串流處理輸出?
    如何在 Python 中即時串流處理輸出?
    在進程執行過程中連續輸出顯示在Python腳本中,我們經常利用子程序來執行外部程序。雖然這是一個強大的功能,但在檢索其輸出之前等待進程完成可能會令人沮喪。為了解決這個問題,讓我們探索一種在進程運行時連續串流傳輸進程輸出的方法。 傳統上,我們使用 subprocess.communicate() 來擷...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中選擇正確的使用者瀏覽器偵測方法?
    如何在 PHP 中選擇正確的使用者瀏覽器偵測方法?
    使用PHP 進行可靠的用戶瀏覽器檢測確定最佳方法當涉及到PHP 中的用戶瀏覽器檢測時,選擇使用$_SERVER ['HTTP_USER_AGENT'] 和get_browser 函數出現。每種方法都有其優點和缺點。 $_SERVER['HTTP_USER_AGENT'...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中反序列化 jQuery 序列化表單?
    如何在 PHP 中反序列化 jQuery 序列化表單?
    在PHP 中反序列化jQuery 序列化表單利用jQuery 的$('#form').serialize() 方法提交表單資料時到一個PHP頁面,問題就出現了:我們如何在PHP中反序列化它? PHP jQuery序列化表單的反序列化PHP的parse_str()函數提供了有效的解決方...
    程式設計 發佈於2024-11-17
  • 如何在不使用代理程式的情況下追蹤 JAX-WS 中的 XML 請求和回應?
    如何在不使用代理程式的情況下追蹤 JAX-WS 中的 XML 請求和回應?
    在沒有代理的情況下跟踪JAX-WS 中的XML 請求/響應利用JAX-WS 參考實現,可以訪問原始請求/無需使用代理即可回應Web 服務的XML。這可以透過設定啟用日誌記錄通訊的系統屬性來實現。以下是完成此動作的程式碼:System.setProperty("com.sun.xml.ws....
    程式設計 發佈於2024-11-17
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-17
  • 正規表示式夠了嗎?驗證電子郵件地址的全面指南
    正規表示式夠了嗎?驗證電子郵件地址的全面指南
    確保電子郵件地址的有效性:綜合指南驗證電子郵件地址的有效性是資料驗證的一個重要面向。 Regex(正規表示式)提供了一個強大的工具,可確保使用者輸入符合特定的電子郵件格式。然而,子網域電子郵件地址的存在經常在驗證過程中帶來挑戰。 基於正規表示式的驗證的局限性雖然正則表達式對於檢查基本資訊很有用電子郵...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3