Russian Qt Forum
Ноябрь 23, 2024, 15:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: обработка сигнала об ошибке...  (Прочитано 6026 раз)
west
Гость
« : Май 11, 2005, 11:31 »

Как правильно завершить обработку сигнала об ошибке, например SIGSEGV? Т.е. приложение на каком-то из этапов выдает подобное сообщение, я его перехватываю - что сделать дальше, как отменить выполняющуюся операцию (к примеру выделение памяти) ? Хочется выдать сообщение пользователю типа "ошибка по адресу ........" и вернуть комплекс в исходное состояние. Разработку веду на С++ под Qt 2.3.0, там обработок исключительных ситуаций нет.
Записан
Sergeich
Гость
« Ответ #1 : Май 11, 2005, 14:10 »

man 2 signal; man 7 signal; man 2 sigaction
Записан
Hellenna
Гость
« Ответ #2 : Май 11, 2005, 19:37 »

Примерно так:
Код:
sig_atomic_t sigusr1_count=0;
void handler(int signal_number){
    ++sigusr1_count;
}
int main()
{
     struct sigaction sa;
     memset(&sa, 0, sizeof(sa));
     sa.sa_handler=&handler;
     sigaction(SIGSEGV, &sa, NULL);
      ....
}
Записан
west
Гость
« Ответ #3 : Май 14, 2005, 10:31 »

я в своем приложении тестирую чужие dll, исходников их у меня нет, только описание входных и выходных параметров. dll запускаю все в отдельных потоках, класс запуска dll мой, наследован от QThread. Если dll валится, удается только поймать SIGSEGV в main моей программы. Причем в обработчике сигнала об ошибке, как было предложено Hellenna, никаких действий выполнить не удается, так как он начинает вызываться постоянно. Впечатление что система генерит бесконечно этот сигнал об ошибке. Да и в документации написано что обработчики сигналов должны быть короткими. Если запускать dll через отдельный процесс, типа использовать fork() и execvp(), тогда можно поймать завершение дочернего процесса, но очень тяжело обмениваться с dll данными во время ее выполнения, короче такой вариант для меня не подходит. Чего делать-то?
Записан
Sergeich
Гость
« Ответ #4 : Май 14, 2005, 11:04 »

Если dll-ка будет сидеть в адресном пространстве твоего приложения, то никакая обработка сигналов тебе не поможет. Так что едиственное безопасное решение - порождать другой процесс, и запускать dll в нем. А для обмена данными пожно попробовать юзать шаренную память.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 21.