2008-09-01 75 views
13

我正在探索在Erlang中编写应用程序的可能性,但它需要有一部分用Cocoa编写(推测Objective-C)。我希望前端和后端能够轻松沟通。如何做到这一点最好?写一个Cocoa前端到Erlang应用程序的好方法是什么?

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

回答

10

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

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

Mac OS X launchd这个系统真的很酷。如果您指定应通过安全的Unix域套接字按需启动作业,则launchd实际上将创建具有适当权限的套接字本身,并通过作业属性列表中指定的环境变量通告其位置。作业在启动时,实际上会通过launchd将文件描述符传递到套接字,当它执行简单的检入时。

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

+0

不幸的是,launchd的这些天只是令人遗憾地没有记录。 – uchuugaka 2016-06-23 15:28:14

1

通常创建前UNIX命令Cocoa应用程序或其他无头的程序,当您使用NSTask

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

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

您可以通过的stdin/stdout/stderr方式后端进程进行通信。 Bascially NSTaskexec(或forksystem,我总是忘记区别)的高级包装。

据我了解,您不希望Erland程序成为连续运行的后台守护程序,但如果这样做,请使用@Chris's建议。

1

erl_call应使用从NSTask。我从Textmate命令中使用它,速度非常快。将erl_call和OTP gen_server结合起来可以让你相对容易地保持持久的后端状态。有关更多详细信息,请在我的博客上查看我在erl_call上的文章。

1

使用NSTask你也可以考虑使用PseudoTTY.app(它允许交互式通信)!

另一个感兴趣的示例代码可以是BigSQL,一种PostgreSQL客户端,它允许用户将SQL发送到服务器并显示结果。

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