Что такое хороший способ, чтобы написать какао переднего конца приложения Erlang?
=================================================================================

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

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

 

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

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

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

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

 

Обычно при создании Cocoa приложений, передний UNIX команды или другие обезглавленные программы вы используете [`NSTask`](https://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSTask_Class/Reference/Reference.html):

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

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

Как я понимаю, вы не хотите, чтобы программа Erland быть фоном демоном , который работает непрерывно, но если вы делаете, пойти с [@ Крисом](https://stackoverflow.com/questions/37381/whats-a-good-way-to-write-a-cocoa-front-end-to-an-erlang-application#37408) внушения.

 

Одним из способов является способ Тео с NSTask, NSPipe и NSFileHandle. Вы можете начать, глядя на код CouchDBX [http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/](https://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/)

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

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

 

Штепсельный домен подходы NSTask и Unix являются большими предложениями. Что-то, чтобы следить является реализацией Erlang FFI это в работах:

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

 

erl\_call должны быть пригодными для использования в NSTask. Я использую его из команды Textmate и очень быстро. Сочетание erl\_call с OTP gen\_server позволит вам сохранить постоянное состояние бэкэнда с относительной легкостью. См мой пост на erl\_call в моем блоге для более подробной информации.

 

Использование NSTask вы можете также рассмотреть возможность использования [PseudoTTY.app](http://amath.colorado.edu/pub/mac/programs/) (что позволяет интерактивное общение)!

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

```
open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml

```