簡體   English   中英

C++ 中的 SIGINT 信號()/sigaction

[英]SIGINT signal()/sigaction in C++

所以這是我的代碼:

void sigHandle(int sig)
{
    signal(SIGINT, sigHandle);    //Is this line necessairy?
    cout<<"Signal: "<<sig<<endl;    
}

int main(){

    signal(SIGINT, sigHandle);

    while(true){ //Supposed to loop until user exits.

    //rest of my code
    
    }
}

現在是我的信號()所接收的信號情報命令(CTRL + C正確?)當我的功能sigHandle應與2(SIGINT數)的整數值被稱為的理解,該方法應該運行和程序應該出口。

我想要做的只是打印信號編號並繼續前進,但是在打印出“信號:2”后它退出了。

(最終我應該處理前 32 個中斷,但我認為Ctrl + C將是最困難的,所以我從這里開始。)

在主要,如果我做信號(SIGINT,SIG_IGN); 它正確地忽略了信號並且不退出,但我現在無法知道我是否收到了 SIGINT 中斷。

早些時候我在玩 sigaction 結構,但我找不到任何真正全面的文檔,所以我決定只使用“原始”信號處理。

這是我的 sigaction 代碼(與上面的問題相同):

struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);

謝謝你的幫助!

編輯

好的,經過許多小時的瀏覽手冊頁和互聯網,我遇到了一個(非常)貧民窟解決方案,涉及保存堆棧前無限循環,然后當中斷來臨時,做我需要做的事情,然后重新設置堆棧回到原來的位置並調用 sigrelse() 命令來重新設置任何可能已更改但未重新加載的狀態。

我知道這不是解決這個問題的最優雅/高效/甚至社會可接受的解決方案,但它有效,據我所知我沒有在任何地方泄漏任何內存,所以一切都很好......

我仍在尋找這個問題的解決方案,我認為我的堆棧重新設置惡作劇只是一個臨時解決方案......

謝謝!

它不是。 您只需用相同的功能替換 SIGINT 的句柄。 你如何編程執行等待?

如果你有類似的東西:

int main
{ 
 // ...

  int r = read(fd, &buff, read_size); // your program hangs here, waiting for the data.
                                      // but if signal occurred during this period of time
                                      // read will return immediately, and r may != read_size

  return 0;  // then it will go straight to return.
}

另請注意,您不應在信號處理程序中調用 stdio(或其他不可重入函數)。 (您的信號處理程序可能會在 malloc 或 C++ 等價物的中間調用)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM