[erlang-questions] How to fork/clone a process in Erlang?

ok <>
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 mailing list