2012-06-04 2 views
3

Я пытаюсь получить обработчик сигнала для работы на C++ и не могу понять, как использовать некоторые свойства класса.получить свойства объекта из обработчика posix-сигнала в C++

Обработчик сигнала запускается, когда принимается сигнал SIGIO, и мне нужно проверить, подходит ли он для правильного сокета.

Все, что мне нужно сделать, это иметь доступ к приватным socket_ и общественным received().

namespace sigh { 

template<typename SomeType> 
class WorkWithSignals 
{ 
public: 
    void received(unsigned char* data, size_t len, unsigned int from); 

private: 
    static void sigio_handler (int sig, siginfo_t* siginfo, void* empty); 
    int socket_; 
}; 

extern "C" { 
    void sigio_handler (int sig, siginfo_t* siginfo, void* empty) { 
     if (siginfo->si_fd == ***socket_***) 
     ***received***(); 
    } 
} 

} 

Среди других вещей, которые я попытался определения статической структуры переменной перед определением sigio_handler, заполнить его в конструктор класса, определенного после sigio_handler, но sigio_handler жаловался, что его не было в области.

Любые указатели?

+0

Не связано с вашей проблемой, но обработчики сигналов не обязательно должны быть 'extern 'C". –

ответ

1

Вы не можете получить доступ к переменной-члену из статического метода (объекта просто нет). Вы также можете сделать свою статическую переменную socket_ и ссылаться на нее WorkWithSignals<...>::socket_.

1

Обработчик сигналов является статическим методом, поэтому он не связан ни с одним экземпляром вашего класса.

страница sigaction людей содержит пункт (относящийся к параметру siginfo_t):

* SIGPOLL/SIGIO fills in si_band and si_fd. The si_band event is a bit 
    mask containing the same values as are filled in the revents field by 
    poll(2). The si_fd field indicates the file descriptor for which the 
    I/O event occurred. 

Предполагая, что вы хотите продолжить с вашим текущим дизайном на основе сигнала (опрос() может быть проще), я хотел бы предложить статическая карта дескрипторов файлов для экземпляров вашего класса WorkWithSignals.

Затем в статическом обработчике сигналов найдите экземпляр, связанный с данным файловым дескриптором (поле сокета), а затем вызовите нестатический метод для выполнения необходимой работы с конкретным объектом.

к ДЕЦЛ из WorkWithSignals добавить

static std::map<int, WorkWithSignals*> object_registry_; 

и необходимости определения в исходном файле. Управляйте членством в карте, добавляя к карте, прежде чем регистрировать обработчик сигнала и удалять с карты, прежде чем уничтожить объект. Затем:

Смежные вопросы