2011-05-17 65 views
2

我想在我的程序中捕捉SIGTERM,這是問題所在。c + + SIGTERM捕獲後不返回

我的程序啓動並設置信號SIGTERM的偵聽器。然後程序進入一個循環,它使用select連續檢查一個套接字文件描述符,以便它不被阻塞。當我通過kill發送程序TERM時,程序確認它接收到信號,但是這不會返回到我先前描述的循環。

信號處理程序在類中設置一個公共變量,以便循環知道要退出。我應該提到,在gdb中這可以工作,但不在gdb之外。

在此先感謝。

class A 
{ 
    public: 
     bool volatile stop; 

    void loop(); 
    { 
     while(!stop) 
      { 
       //check socket 
      } 
    } 
}; 

A *aptr; 

void sigterm_handler(int i) 
{ 
    aptr->stop = true; 
} 

int main() 
{ 
    A a; 
    aptr = &a; 
    struct sigaction sa; 
    sa.sa_handler = &sigterm_handler; 
    sigaction(SIGTERM, &sa, NULL); 
    a.stop = false; 
    a.loop(); 
} 

編輯:對不起沒有完成正確的代碼。

+0

你發佈的代碼存在問題:'stop'沒有被初始化,'loop()'沒有被調用。 – 2011-05-17 12:29:39

+0

你可能想讓停止不穩定。 – 2011-05-17 12:38:50

+1

你使用哪個平臺和哪個編譯器標記?問一個簡單的'g ++ -o test test.cpp'(你的文件是test.cpp),這對我有效,但如果我添加了一個優化標誌,比如'g ++ -O2 -o test test.cpp',那麼你將需要採取@linuts的答案,這是爲了使其工作,使「停止」易失性。 – Jason 2011-05-17 12:46:01

回答

3

你需要停止「volatile」,否則編譯器不會在循環中檢查它,因爲它認爲它不能改變。

bool volatile stop; 
3

也許這與struct sigaction的其他成員沒有初始化。 gdb可能會將內存初始化爲0,而沒有gdb則不會初始化。

+0

雖然沒有抱歉。 – Thomas 2011-05-17 12:44:40

0

您可能會發現任何信號(特別是SIGTERM)都會終止您在while循環內執行的任何系統調用。而「系統調用」指的是從套接字讀取或選擇或連接的任何東西。

Check out this write up.

Also check the example test program

+0

@PANG LMGTFY。固定。 – 2018-01-25 12:13:19

0

如上所述,volatile是正確的答案。另外,我想補充的是,根據您的代碼調用sigwait()將是更好的解決方案,而不是循環... BTW在你調用sigwait不需要信號處理

哎呀的情況下,遺憾錯過一個插座操作