2009-11-05 23 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