Всегда ли исполняемые файлы открывают окно терминала в MacOS?

Я нахожусь на MacOS X, и я довольно плохо знаком с вещами типа связки приложения. Я пишу программу, которая открывает окно и регистрирует ввод мыши, а не инструмент командной строки. Когда я компилирую свой код (написанный на C, если это важно) в исполняемый файл ("исполняемый файл unix"), а затем запускаю этот файл напрямую (например, дважды щелкнув по нему), появляется окно терминала и тогда появится окно программы. Аналогично, если я перехожу к каталогу исполняемого файла и открываю его из командной строки, он открывает окно / Другое / терминал, а затем окно программы.

Однако, если я обертываю исполняемый файл в связке (таким образом, я полагаю, превращая его в правильное "приложение"), то когда я запускаю приложение, либо двойным щелчком, либо из командной строки, открывается окно программы и никаких новых окно терминала создано. Является ли это просто свойством архитектуры "комплекта приложений"? Или есть способ, которым я могу запустить сырой исполняемый файл, не вызывая другое окно терминала? Я подозреваю, что я неправильно понимаю что-то фундаментальное. Заранее спасибо!

2 ответа

Решение

Я верю в то, что вы видите правильно. Чтобы отдельное окно не всплывало, вам нужно заключить его в пакет.

Запуск с помощью двойного щелчка на пакете или с помощью команды "открыть" из терминала использует службы запуска Apple, которые поддерживают список известных (зарегистрированных) приложений. Когда приложение (пакет) вводится в систему, оно регистрируется в Launch Services и связывается с его URI (например, com.apple.calculator), который присутствует в Info.plist пакета.

Другие элементы в Info.plist сообщают службам запуска, как обращаться с приложением, например проверять, превышена ли минимальная или максимальная версия ОС, или отображать элемент док-станции.

Одиночный двоичный файл не имеет связанного манифеста Info.plist, поэтому его поведение невозможно изменить, и открывается окно терминала.

Голые исполняемые файлы по существу считаются документами в Launch Services (фреймворке, который Finder, Dock и open использование команды, когда вы открываете вещи). Приложение, которое обрабатывает такие документы, является Терминалом. Таким образом, когда вы открываете исполняемый файл таким способом, он запускает терминал, если он еще не запущен, и говорит ему открыть документ. Терминал делает это, открывая новое окно оболочки и автоматически вводя путь к "документу" в виде командной строки.

Launch Services обрабатывает связанные приложения, а также приложения. Если приложение уже запущено, оно активирует его и, возможно, открывает новое безымянное окно. В противном случае он запускает его.

Как замечает Роб Нейпир в комментариях, если вы запускаете исполняемый файл непосредственно из командной строки (или если какое-то уже запущенное приложение запускает его с помощью NSTask или fork+exec), он просто запустится. Службы запуска не будут задействованы, поэтому Терминалу не будет предложено открыть исполняемый файл как документ.

Другие вопросы по тегам