将 Cocoa 前端编写到 Erlang 应用程序的好方法是什么?

What's a good way to write a Cocoa front-end to an Erlang application?

提问人:jmah 提问时间:9/1/2008 最后编辑:Bill the Lizardjmah 更新时间:9/22/2010 访问量:1999

问:

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

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

Objective-C 可可 macOS Erlang

评论


答:

10赞 Chris Hanson 9/1/2008 #1

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

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

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

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

评论

0赞 uchuugaka 6/23/2016
不幸的是,这些天来,推出的记录严重不足。
0赞 Chris Hanson 6/29/2016
我通常发现手册页很有用。如果您对此有疑问,最好在 Stack Overflow 上提问。launchd
1赞 Theo 9/1/2008 #2

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

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

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

您可以通过 // 的方式与后端进程进行通信。基本上是一个高级包装器(或或,我总是忘记区别)。stdinstdoutstderrNSTaskexecforksystem

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

2赞 Jon Gretar 9/10/2008 #3

一种方法是 Theo 使用 NSTask、NSPipe 和 NSFileHandle 的方法。你可以先查看 CouchDBX 的代码 http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

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

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

1赞 argv0 9/10/2008 #4

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

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

1赞 AlainODea 10/26/2008 #5

erl_call应该可以从 NSTask 使用。我从 Textmate 命令中使用它,它非常快。将 erl_call 与 OTP gen_server结合使用,可以让您相对轻松地保持持久的后端状态。有关更多详细信息,请参阅我erl_call博客上的帖子。

1赞 chad 9/22/2010 #6

使用 NSTask,您还可以考虑使用 PseudoTTY.app(允许交互式通信)!

另一个感兴趣的示例代码可能是 BigSQL,这是一个 PostgreSQL 客户端,使用户能够将 SQL 发送到服务器并显示结果。

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