Написание обработчиков сигналов для общих библиотек или DLL? - PullRequest
2 голосов
/ 04 января 2009

У меня есть Приложение A (от какой-то компании X). Это приложение позволяет мне расширять функциональность, позволяя мне писать свои собственные функции.

Я приказываю Приложению A вызывать мои пользовательские функции в файле конфигурации Приложений A (таким образом он знает, что Appl A должен вызывать пользовательские Функции). Приложение A использует указатели функций, которые я должен зарегистрировать в приложении A перед вызовом своих пользовательских функций.

Если в моих пользовательских функциях, написанных пользователем, есть ошибка или сбой в работе, приложение А перестанет работать. Например, если у меня ошибка сегментации в моих пользовательских функциях.

Таким образом, Приложение A загрузит мою пользовательскую функцию из общего DLL-файла. Это означает, что мои пользовательские функции будут работать в приложении A 'Адресное пространство процесса.

Я хочу обработать определенные сигналы, такие как ошибка сегментации, деление на ноль и переполнение стека, но приложения A имеют для этого свои собственные обработчики сигналов,

Как я могу написать свои собственные обработчики сигналов для перехвата исключений в моих пользовательских функциях, чтобы я мог изящно очиститься, не затрагивая большую часть Приложения A? Поскольку мои пользовательские функции будут вызываться в процессе приложений A, ОС будет вызывать обработчики сигналов, написанные в приложении A, а не мои пользовательские функции.

Как я могу это изменить? Я хочу, чтобы ОС вызывала обработчики сигналов, записанные в моих функциях, но только для сигнала, генерируемого моими функциями, который является асинхронным по своей природе.

Примечание. У меня нет исходного кода Приложения A, и я не могу внести в него какие-либо изменения, поскольку он контролируется другой компанией.

Я буду использовать C и только C на платформах Linux, Solaris и, вероятно, Windows.

Ответы [ 3 ]

2 голосов
/ 04 января 2009

Вы не указываете, с какой платформой вы работаете, поэтому я отвечу для Linux, и она должна быть действительной и для Windows.

Когда вы устанавливаете свои обработчики сигналов, системный вызов, который вы используете, возвращает предыдущий обработчик. Он делает это так, что вы можете вернуть его, если вы больше не заинтересованы в обработке этого сигнала.

Справочная страница Linux для сигнала
MSDN запись по сигналу

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

1 голос
/ 01 ноября 2016

Самый простой способ сделать это - запустить код приложения в отдельном процессе, который взаимодействует со встроенным кодом общей DLL через некоторый механизм IPC. Вы можете обрабатывать любые сигналы в своем процессе, не влияя на другой процесс. Обычно упомянутые вами условия (ошибка сегмента, деление на ноль, переполнение стека) указывают на ошибки в программе и приводят к завершению. Вы не можете ничего сделать, чтобы "справиться" с ними, кроме устранения основной причины ошибки.

0 голосов
/ 04 января 2009

в C ++, вы можете поймать их, поместив свой код в try-catch:

try
{
   // here goes your code
}
catch ( ... )
{
   // handle segfaults
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...