Обработка SIGABRT в приложениях Mac
Я создал очень простое настольное приложение для Mac OS. Из-за ограничений я не смог использовать xcode. Я создаю каталог.app вручную, и основным исполняемым файлом на данный момент является сценарий оболочки.
Когда я пробовал свое приложение, я заметил, что если я открою и закрою его слишком быстро, приложение зависнет. В этот момент я, казалось, не смог даже заставить его выйти, и мне пришлось самому запустить.app. Друг сказал мне, что Mac-приложения должны обрабатывать SIGABRT, и если они этого не делают, есть период ожидания, когда приложение может выглядеть как замороженное, что может объяснить то, что я наблюдал.
Я искал вокруг, но не знал, где найти больше информации об этом. Кто-нибудь еще может объяснить эту ситуацию? При каких обстоятельствах приложение получит SIGABRT и как с ним обращаться? Любые ссылки или литература по этой теме, будут очень благодарны.
1 ответ
На случай, если кто-нибудь наткнется на это:
Так что мой друг имел в виду сигналы Unix здесь. https://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm
(чтобы увидеть, что доступно в вашей ОС, введите kill -l)
Мой основной исполняемый файл, в моем MyApp.app/Contents/MacOS, представляет собой сценарий оболочки. Так что я нашел, что могу сделать, это использовать команду trap. Это даст поведение, если исполняемый файл получит один из сигналов. Пример - теперь я добавляю эту строку в верхней части моего сценария оболочки:
ловушка "выход" 5 6
Это означает, что если исполняемый файл получает сигнал SIGABRT (6) или SIGTRAP (5), он выполнит команду exit и завершит работу. (Я не уверен, какие сигналы должны обрабатываться и какой курс лучше всего, я думаю, это может зависеть от вашего собственного приложения, но это было просто примером того, что нужно сделать)
Вот ресурс о командах прерывания и сигналах unix: https://www.tutorialspoint.com/unix/unix-signals-traps.htm
Почему это имеет значение - я считаю, ранее, были сценарии, когда, например, если я открыл приложение, когда оно уже было открыто, оно получало сигнал Unix, как SIGABRT. Этот сигнал не обрабатывался, и приложение не знало, что делать в этом сценарии, и зависало. Хотя я не подтвердил, что это происходит.