Хорошо разработанный API обратного вызова C позволяет передавать значение в функцию обратного вызова. Это позволяет вам иметь обратные вызовы с отслеживанием состояния.
В этом случае union sigval
является объединением int
и void*
. Вы должны придерживаться своего состояния в любом из этих двух.
std::function<Sig>
может хранить состояние, поэтому вам нужно передать это состояние через.
A std::function
не является указателем на функцию. Чтобы передать его API-интерфейсу обратного вызова функции C, вам нужно обернуть его и передать как часть void*
.
struct sig_cb {
void(* function)(sigval_t);
void* pvoid;
};
sig_cb make_signal_callback( std::function<void()>* pf ) {
return {
[](sigval_t v) { (*static_cast<std::function<void()>*>(v.sival_ptr))(); },
pf
};
}
затем измените ваш код:
functionCbType callcbk;
...
struct sigevent se;
auto cb = make_signal_callback(&callcbk);
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = cb.function;
se.sigev_value.sival_ptr = cb.pvoid;
se.sigev_notify_attributes = NULL;
int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);
и оно должно работать. Естественно, время жизни вашего std::function
должно управляться отдельно.