簡體   English   中英

信號處理錯誤

[英]Signal handling error

當我使用my_handler作為函數時,沒有錯誤,但是我不能,因為我必須在那兒使用其他方法。

如果我在下面構建代碼: 錯誤:在成員functi上的無效使用(您是否忘記了'()'?)

這是我的第一個C ++程序

void Client::my_handler(int s){
    if (s == SIGINT){
        printf("SIGINT\n");
    // here I have to use stop_thread method 
    }
}


int main (int argc, const char **argv) {
  Client client(argc, argv);
  client.before_start();

  struct sigaction sigIntHandler;

  sigIntHandler.sa_handler = (__sighandler_t) client.my_handler; //error here
  sigemptyset(&sigIntHandler.sa_mask);
  sigIntHandler.sa_flags = 0;
  sigaction(SIGINT, &sigIntHandler, NULL);

  client.run();

  return 0;
}

在C ++中,成員函數(與類實例相關的函數,例如client.my_handler )與常規函數不同(在這里像int main(int arg, const char** argv)東西)。 這就是為什么您不能將client.my_handler__sighandler_t

Client::my_handler有一個隱藏參數Client* 所以實際上,它的簽名( void my_handler(Client* this, int s)來看)看起來像是void my_handler(Client* this, int s) C ++在幕后做了一些工作,因此您可以引用此變量,而不必執行this this-> (大多數情況下)。 當你做類似電話的事情時

client.my_handler(SIGINT)

C ++正在將其翻譯為

my_handler(&client, SIGINT)

也許現在你可以看到問題: __sighandler_t是一個函數指針的別名,但client.my_handler實際上是兩個指針:函數指針my_handler和指針到client

信號處理程序僅接受函數指針,而不接受更通用的函數對象(它是函數指針加一些其他數據)。 信號處理來自C,但函數對象來自C ++。

信號處理程序的唯一解決方案是某種全局變量。

@SJL很好地解釋了為什么它不起作用,並提供了C風格的解決方法。

如果可以使用Boost,則可以使用boost boost::asio::signal_set以更C ++的方式處理信號。 async_wait函數可以接收lambda,綁定成員函數指針或具有適當簽名的任何其他可調用類型。

暫無
暫無

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

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