Objective c 什么';将Cocoa前端写入Erlang应用程序的好方法是什么?

Objective c 什么';将Cocoa前端写入Erlang应用程序的好方法是什么?,objective-c,cocoa,macos,erlang,Objective C,Cocoa,Macos,Erlang,我正在探索用Erlang编写应用程序的可能性,但它需要用Cocoa(大概是Objective-C)编写一部分。我希望前端和后端能够轻松沟通。如何才能做到最好 我可以考虑使用C端口和连接的进程,但我想我想要相反的情况(前端启动并连接到后端)。有命名管道(FIFO),或者我可以通过TCP端口或命名BSD套接字使用网络通信。有人在这方面有经验吗?一种方法是让应用程序的Erlang核心成为守护进程,Cocoa前端使用您设计的一些简单协议通过Unix域套接字与之通信 使用Unix域套接字意味着Erlang

我正在探索用Erlang编写应用程序的可能性,但它需要用Cocoa(大概是Objective-C)编写一部分。我希望前端和后端能够轻松沟通。如何才能做到最好


我可以考虑使用C端口和连接的进程,但我想我想要相反的情况(前端启动并连接到后端)。有命名管道(FIFO),或者我可以通过TCP端口或命名BSD套接字使用网络通信。有人在这方面有经验吗?

一种方法是让应用程序的Erlang核心成为守护进程,Cocoa前端使用您设计的一些简单协议通过Unix域套接字与之通信

使用Unix域套接字意味着Erlang守护进程可以通过
launchd
按需启动,Cocoa前端可以通过环境变量找到要使用的套接字路径。这使得应用程序和守护进程之间的会合变得微不足道,同时也使得开发多个前端(或者可能是一个包装与守护进程通信的框架)变得简单

Mac OS X
launchd
系统以这种方式非常酷。如果指定作业应通过安全Unix域套接字按需启动,
launchd
将实际创建具有适当权限的套接字本身,并通过作业属性列表中命名的环境变量公布其位置。当作业启动时,当它执行简单的签入操作时,
launchd
实际上会将一个文件描述符传递给套接字


最终这意味着前端打开套接字与守护进程通信的整个过程,
launchd
启动守护进程,以及对通信作出响应的守护进程都是安全的,即使前端和后台程序以不同的权限级别运行。

通常在创建前置UNIX命令或其他无头程序的Cocoa应用程序时,您会使用:

使用NSTask类,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行。NSTask对象创建一个单独的可执行实体;它与NSThread的不同之处在于它不与创建它的进程共享内存空间

任务在由多个项目的当前值定义的环境中运行:当前目录、标准输入、标准输出、标准错误和任何环境变量的值。默认情况下,NSTask对象从启动它的进程继承其环境。如果任务有任何不同的值,例如,如果当前目录应更改,则必须在启动任务之前更改该值。任务运行时无法更改其环境

您可以通过
stdin
/
stdout
/
stderr
与后端进程通信。基本上,
NSTask
exec
的高级包装(或者
fork
或者
system
,我总是忘记区别)


据我所知,您不希望Erland程序成为一个连续运行的后台守护程序,但如果您希望,请接受建议。

一种方法是Theo的方法,使用NSTask、NSPipe和NSFileHandle。您可以从查看CouchDBX的代码开始

端口是可能的,但一点也不好


有什么原因不能简单地用mochiweb和json通信来处理这种通信吗?

NSTask和Unix域套接字方法都是很好的建议。需要注意的是正在进行的Erlang FFI实现:


erl\u调用应该可以从NSTask中使用。我通过Textmate命令使用它,速度非常快。将erl_调用与OTP gen_服务器相结合,可以相对轻松地保持持久的后端状态。在我的博客上看到我的帖子以获取更多的细节。

< P>使用NSTASK,你也可以考虑使用(允许交互通信)!p> 另一个感兴趣的示例代码可能是BigSQL,它是一个PostgreSQL客户机,使用户能够将SQL发送到服务器并显示结果

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

不幸的是,launchd的文档记录不足。我通常认为
launchd
手册页很有用。如果您对此有疑问,最好询问堆栈溢出问题。