Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reliable bidirectional communication to a Linux process?

What is the reliable way of implementing bidirectional communication to a Linux process?

I see that popen does not seem to support "r" and "w" access at the same time... or at least that's what is implied:

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

(I am so missing Erlang at the moment)

like image 885
jldupont Avatar asked Dec 02 '25 09:12

jldupont


2 Answers

Unix domain sockets are your friend.

A Unix domain socket or IPC socket (inter-process communication socket) is a data communications endpoint that is similar to an Internet socket, but does not use a network protocol for communication. It is used in POSIX operating systems for inter-process communication.

You reserve a name for your communications channel, such as /myapp/ipc, and then both processes open that address using a UNIX socket:

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);

Now you can use listen or connect or whatever else in the socket family. It's a little bit of work, but is the best way to achieve IPC on Linux.

Since Erlang is just a nice language for specifying little servers (processes) that communicate over named pipes (processes), this model should feel comfortable to you.

like image 88
Frank Krueger Avatar answered Dec 03 '25 23:12

Frank Krueger


Good old TCP/IP connections have always worked well for me.

like image 28
Michael Kohne Avatar answered Dec 03 '25 23:12

Michael Kohne



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!