Что происходит за кулисами, когда пользователь дает команду « Quit
или « Force Quit
из-за пределов целевого приложения (например, из Activity Monitor)?
3 ответа
Как правило, операция «Выход» не является сигналом; это событие Apple, которое является тем же типом межпроцессного взаимодействия, которое используется для сценариев AppleScript и для открытия файлов или URL-адресов в уже работающих приложениях, и происходит из линии Mac OS, а не из Unix.
Процесс должен специально регистрироваться для получения событий Apple, и такие процессы являются либо процессами с графическим интерфейсом пользователя, либо, по крайней мере, связаны с сеансом рабочего стола (который, за исключением Activity Monitor, является единственным способом, которым они в конечном итоге могут вообще отказаться).
Однако, если вы «выходите» из процесса Activity Monitor, и этот процесс не зарегистрирован для получения событий Apple, он отправит SIGTERM (15).
Вы можете использовать dtrace, чтобы увидеть, какие сигналы отправляются процессам:
sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d", execname, args[2], args[1]->pr_pid); }'
Если вы принудительно завершаете работу приложения, показанного в Dock, сигнал обычно составляет -15 (TERM). Но если вы принудительно завершаете фоновый процесс из Activity Monitor, обычно это -9 (KILL).
Вы можете просмотреть события принудительного выхода для приложений с графическим интерфейсом, отправленных в system.log
. Или используйте dtrace, как написано в этой теме. С dtrace вы получаете больше детализации, но вам нужны привилегии root.