Какой хороший способ написать интерфейс Какао для приложения Erlang? - PullRequest
13 голосов
/ 01 сентября 2008

Я изучаю возможность написания приложения на Эрланге, но для этого потребуется часть, написанная на Какао (предположительно Objective-C). Мне бы хотелось, чтобы интерфейс и сервер могли легко общаться. Как это лучше всего сделать?

Я могу подумать об использовании портов C и связанных процессов, но я думаю, что мне нужна обратная ситуация (запуск интерфейса и подключение к фону). Есть именованные каналы (FIFO), или я мог бы использовать сетевую связь через порт TCP или именованный сокет BSD. У кого-нибудь есть опыт в этой области?

Ответы [ 6 ]

10 голосов
/ 01 сентября 2008

Один из способов состоял бы в том, чтобы ядро ​​приложения Erlang было демоном, с которым интерфейс Cocoa взаимодействует через сокет домена Unix, используя какой-то простой протокол, который вы разработали.

Использование сокета Unix-домена означает, что демон Erlang может быть запущен по требованию launchd, а клиент Cocoa может найти путь к сокету для использования через переменную среды. Это делает рандеву между приложением и демоном тривиальным, а также упрощает разработку нескольких внешних интерфейсов (или, возможно, каркаса, связывающего связь с демоном).

Система Mac OS X launchd действительно крутая в этом смысле. Если вы укажете, что задание должно запускаться по требованию через безопасный сокет домена Unix, launchd фактически создаст сам сокет с соответствующими разрешениями и объявит свое местоположение через переменную среды, указанную в списке свойств задания. При запуске задания на самом деле передается файловый дескриптор сокету launchd при простой регистрации.

В конечном итоге это означает, что весь процесс внешнего интерфейса, открывающего сокет для связи с демоном, launchd запуска демона, и демон, отвечающий на связь, может быть безопасным, даже если внешний интерфейс и демон запускается с разными уровнями привилегий.

2 голосов
/ 10 сентября 2008

Один путь - это путь Тео с NSTask, NSPipe и NSFileHandle. Вы можете начать с просмотра кода для CouchDBX http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

Порты возможны, но совсем не хороши.

Есть ли какая-то причина, по которой это общение не может быть просто обработано с помощью связи mochiweb и json?

1 голос
/ 22 сентября 2010

Используя NSTask, вы также можете рассмотреть возможность использования PseudoTTY.app (что позволяет интерактивное общение)!

Другим примером интересующего кода может быть BigSQL, клиент PostgreSQL, который позволяет пользователю отправлять SQL на сервер и отображать результат.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
1 голос
/ 26 октября 2008

erl_call должен использоваться из NSTask. Я использую его из команды Textmate, и это очень быстро. Комбинация erl_call с OTP gen_server позволит вам сохранить постоянное состояние бэкенда с относительной легкостью См. Мой пост на erl_call в моем блоге для более подробной информации.

1 голос
/ 10 сентября 2008

Подходы сокетов доменов NSTask и Unix являются отличными предложениями. Нужно следить за реализацией FFI Erlang, которая находится в разработке:

http://muvara.org/crs4/erlang/ffi

1 голос
/ 01 сентября 2008

Обычно при создании приложений Какао, которые запускают команды UNIX или другие безголовые программы, вы используете NSTask:

Используя класс NSTask, ваша программа может запускать другую программу в качестве подпроцесса и контролировать ее выполнение. Объект NSTask создает отдельный исполняемый объект; он отличается от NSThread тем, что не разделяет пространство памяти с процессом, который его создает.

Задача работает в среде, определяемой текущими значениями для нескольких элементов: текущего каталога, стандартного ввода, стандартного вывода, стандартной ошибки и значений любых переменных среды. По умолчанию объект NSTask наследует свою среду от процесса, который его запускает. Если есть какие-либо значения, которые должны отличаться для задачи, например, если текущий каталог должен измениться, вы должны изменить значение перед запуском задачи. Среду задачи нельзя изменить во время ее выполнения.

Вы можете связаться с внутренним процессом с помощью stdin / stdout / stderr. В основном NSTask - это высокоуровневая оболочка вокруг exec (или fork или system, я всегда забываю разницу).

Насколько я понимаю, вы не хотите, чтобы программа Erland была фоновым демоном, работающим непрерывно, но если вы это сделаете, воспользуйтесь предложением @ Chris's .

...