2009-11-05 4 views
2

Quelle est la manière fiable d'implémenter la communication bidirectionnelle à un processus Linux?Communication bidirectionnelle fiable vers un processus Linux?

Je vois que popen ne semble pas soutenir « r » et « w » l'accès en même temps ... ou du moins c'est ce qui est impliqué:

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

(Je suis tellement manque Erlang en ce moment)

Répondre

8

Unix domain sockets sont votre ami.

Un socket de domaine Unix ou socket IPC (socket de communication inter-processus) est une communication de données de point de terminaison qui est similaire à une prise Internet, mais ne pas utiliser un protocole de réseau pour la communication . Il est utilisé dans les systèmes d'exploitation POSIX pour la communication inter-processus .

Vous réservez un nom pour votre canal de communication, comme /myapp/ipc, puis les deux processus ouverts qui adresse à l'aide d'une prise 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); 

vous pouvez utiliser listen ou connect ou tout autre chose dans le famille de douilles. C'est un peu de travail, mais c'est le meilleur moyen d'atteindre IPC sous Linux. Comme Erlang est juste un bon langage pour spécifier les petits serveurs (processus) qui communiquent sur les canaux nommés (processus), ce modèle devrait vous sembler confortable.

+0

... donc je générer un processus et passer une référence à une socket ouverte et écoute dans les arguments? – jldupont

+2

Ou utilisez un socket nommé (voir 'mkfifo'). Pour la communication bidirectionnelle, il suffit d'en avoir deux ... – Wim

2

Les bonnes vieilles connexions TCP/IP ont toujours bien fonctionné pour moi.

+3

Les sockets de domaine Unix sont beaucoup plus efficaces que TCP. –

+1

Mais TCP a l'avantage de permettre à votre système de passer à plus d'une case. Heureusement, le transfert du code des sockets de domaine Unix vers TCP est trivial. –

Questions connexes