2017-03-29 5 views
1

함수로 my_handler를 사용할 때 오류가 없지만 다른 메서드를 사용해야하기 때문에 오류가 없습니다.신호 처리 오류

나는 빌드하는 경우 아래 코드 : 오류 : 회원의 잘못된 사용에 방지 동작 (잊지 않았다을 '()'?)

이 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; 
} 
+0

또한 신호 처리기에서 수행하려는 작업에주의하십시오. 옵션이 매우 제한되어 있습니다. 나는 당신이 안전하게 사용할 수있는 것을 다루는 손을 잘 보지 못할까 두려워합니다. – user4581301

답변

4
입니다

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)과 같은 서명입니다. C++은 this-> (대부분의 경우)을 수행하지 않고 this의 변수를 참조 할 수 있도록 몇 가지 작업을 수행합니다. 당신이 전화처럼 뭔가를 할 때

client.my_handler(SIGINT) 

C++ 아마

my_handler(&client, SIGINT) 

지금 당신은 문제가 볼 수있는 번역되어 __sighandler_t는 함수 포인터의 별칭입니다,하지만 client.my_handler 정말 입니다 포인터 : my_handler의 함수 포인터 및 client의 포인터.

신호 처리기는 더 일반적인 함수 개체 (함수 포인터와 일부 다른 데이터)가 아닌 함수 포인터 만 허용합니다. 신호 처리는 C에서 왔지만 함수 객체는 C++에서 왔습니다.

신호 처리기에 대한 유일한 해결책은 일종의 전역 변수입니다.

0

@SJL은 왜 이것이 작동하지 않는지에 대한 훌륭한 설명을 제공하고 C 스타일의 해결 방법을 제공합니다.

Boost를 사용할 수있는 경우보다 C++ 스타일의 신호를 처리하는 데 boost::asio::signal_set을 사용할 수 있습니다. async_wait function은 람다, 바운드 멤버 함수 포인터 또는 적절한 서명이있는 다른 호출 가능 유형을 수신 할 수 있습니다.

+0

유형 고마워요. 사용할 수 없습니다. – Bando