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