[erlang-questions] How to fork/clone a process in Erlang?
Fri Sep 7 06:31:32 CEST 2012
Erlang processes offer isolation like UNIX processes (as long
as you don't link in any C code, which could do arbitrary damage),
but they are more like threads. In fact they are more like threads
than threads are, being smaller, cheaper to create, and safe (no
more *having* to guess how big to make the stack and being at the
mercy of Cthulhu if you guess wrong!).
There isn't any 'fork()' to copy the current process because
*not* copying a whole lot of stuff you'll never want is part
of what Erlang processes are all about.
Having said this, it would be tedious rather than difficult to
provide a continuation-passing transformer for Erlang:
f(a, Y, b) -> Y;
f(X, Y, Z) -> P = g(X, Y), h(P, Z).
f(a, Y, b, K) -> K(Y);
f(X, Y, Z, K) -> g(X, Y, fun (P) -> h(P, Z, K) end).
and then your fork() isn't that hard:
fork(K) -> K(spawn(fun () -> K(child) end)).
in the library for the continuation passing level, then
at the normal level
Which = fork()
would return 'child' in the child and the child's Pid in the parent.
But I am having a really hard time figuring out what you would
want this for. I've been using UNIX since October 1979 and I've
personally never had any use for a fork() that wasn't followed
by an exec(). I'm aware that people did this to create workers
in a process that listens for connections and then forks, but
these days people seem to prefer using threads for that.
So what is it you *really* want to do that makes fork()
seem like a good way to go?
More information about the erlang-questions