2009-11-05 25 views
2

实现与Linux进程的双向通信的可靠方式是什么?与Linux进程的可靠双向通信?

我看到popen似乎并不支持“R”和“W”在同一时间访问......至少,这就是暗示:

The type argument is a pointer to a null-terminated string which must be either 'r' for reading or 'w' for writing.

(我这么失踪Erlang)

回答

8

Unix domain sockets是你的朋友。

甲Unix域套接字或IPC插座 (进程间通信插座) 是一个数据通信端点 类似于一个Internet套接字,但是 不使用网络协议用于 通信。它在POSIX 操作系统中用于进程间通信 。

您为您的通信信道预留名称,如/myapp/ipc,然后两个进程打开使用UNIX套接字地址:

struct sockaddr_un local; 
int len; 

s = socket(AF_UNIX, SOCK_STREAM, 0); 
local.sun_family = AF_UNIX; 
strcpy(local.sun_path, "/myapp/ipc"); 
len = strlen(local.sun_path) + sizeof(local.sun_family); 
bind(s, (struct sockaddr *)&local, len); 

现在你可以使用listenconnect或任何其他的套接字家族。这是一点点工作,但是在Linux上实现IPC的最佳方式。

由于Erlang只是用于指定通过命名管道(进程)进行通信的小型服务器(进程)的一种很好的语言,因此该模型应该让您感觉舒适。

+0

...所以我会产生一个进程,并传递参数打开和侦听套接字的参数? – jldupont 2009-11-05 19:21:16

+2

或使用指定的套接字(请参阅'mkfifo')。对于双向通信,您只需要其中两个... – Wim 2009-11-05 19:25:58

2

良好的旧TCP/IP连接对我来说一直很好。

+3

Unix域套接字比TCP更有效。 – 2009-11-05 19:32:53

+1

但是TCP具有允许您的系统扩展到1个以上的优点。幸运的是,将代码从unix域套接字移植到TCP是微不足道的。 – 2009-11-05 19:34:47