У меня есть возможная проблема " Это не может быть сделано! ", от которой я бы хотел отскочить от сообщества.
Я работаю с программой libIPFIX, написанной на C. В начале кода программа настраивает функцию обработчика сигнала:
void exit_func ( int signo )
{
if ( verbose_level && signo )
fprintf( stderr, "\n[%s] got signo %d, bye.\n\n", progname, signo );
...clean up global variables...
exit( 1 );
}
Позже в main () обработчик сигнала подключается к большему коду:
int main (int argc, char *argv[])
{
...
// signal handler
signal( SIGKILL, exit_func );
signal( SIGTERM, exit_func );
signal( SIGINT, exit_func );
...
exit(1);
}
Симпатичный шаблон, насколько я могу судить.
Вот моя проблема: я отслеживаю много дополнительных данных в моей модифицированной версии программы, используя malloc () и связанные списки и еще много чего. Когда код обнаруживает сигнал, было бы здорово, если бы exit_func()
мог вызвать мои функции cleanup () для устранения утечек памяти, бла-бла-бла. То, что я люблю, это:
void exit_func ( int signo, LLNode* myData )
{
...same...
cleanUp( myData );
exit( 1 );
}
Но чтение sigaction плюс сообщения типа эти плюс мои собственные эксперименты убедительно свидетельствуют о том, что нет способа передать дополнительный аргумент exit_func()
. И это единственный способ сделать то, что я хочу, - превратить мои данные в глобальную переменную. Я бы очень не хотел этого делать по другим причинам дизайна.
Так что я подумал, что пойду ва-банк и просто спрошу: есть ли способ передать аргумент в exit_func()
? Заранее спасибо.