[英]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.