首頁 >後端開發 >C++ >如何在 C 中攔截 Ctrl C 訊號?

如何在 C 中攔截 Ctrl C 訊號?

DDD
DDD原創
2024-11-16 15:26:03386瀏覽

How can I intercept Ctrl C signals in C  ?

在C 語言中攔截Control-C 訊號

在程式領域,經常需要捕捉鍵盤事件,例如無處不在的Ctrl C ,通常會觸發程式終止。本文解決了這個特定需求:如何在 C 中攔截 Ctrl C 訊號。

捕獲 Ctrl C 事件

在 C 中,捕獲 Ctrl C 有兩種主要方法事件:signal 和 sigaction。

使用sigaction

與訊號相比,sigaction 函數提供了一種更可靠的方法,因為它在不同的實作中提供了更好的控制和可移植性。要使用sigaction,請按照以下步驟操作:

  1. 包含必要的標頭:

    #include <signal.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
  2. 定義訊號處理函數:

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

    在此處理程序中,您可以指定當Ctrl C 按下時要執行的操作

  3. 設定sigaction:

    struct sigaction sigIntHandler;
    
    sigIntHandler.sa_handler = my_handler;
    sigemptyset(&amp;sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    
    sigaction(SIGINT, &amp;sigIntHandler, NULL);

    在這裡,您將訊號處理程序附加到Ctrl C 訊號(SIGINT) 並指定與訊號相關的設定。

  4. 暫停程式:

    pause();

    此函數使程式等待訊號,包括 Ctrl C。

範例:

下面的範例示範如何使用sigaction捕捉Ctrl C events:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

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;    
}

當您執行此程式並按Ctrl C 時,它將列印「捕獲訊號2」並優雅退出。

以上是如何在 C 中攔截 Ctrl C 訊號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn