HIRA THAKUR
HIRA THAKUR

Reputation: 17757

Link two process in Erlang?

To exchange data,it becomes important to link the process first.The following code does the job of linking two processes.

start_link(Name) ->
gen_fsm:start_link(?MODULE, [Name], []).

My Question : which are the two processes being linked here?

Upvotes: 2

Views: 1355

Answers (2)

zxq9
zxq9

Reputation: 13164

In your example, the process that called start_link/1 and the process being started as (?MODULE, Name, Args).

It is a mistake to think that two processes need to be linked to exchange data. Data links the fate of the two processes. If one dies, the other dies, unless a system process is the one that starts the link (a "system process" means one that is trapping exits). This probably isn't what you want. If you are trying to avoid a deadlock or do something other than just timeout during synchronous messaging if the process you are sending a message to dies before responding, consider something like this:

ask(Proc, Request, Data, Timeout) ->
    Ref = monitor(process, Proc),
    Proc ! {self(), Ref, {ask, Request, Data}},
    receive
        {Ref, Res} ->
            demonitor(Ref, [flush]),
            Res;
        {'DOWN', Ref, process, Proc, Reason} ->
            some_cleanup_action(),
            {fail, Reason}
    after
        Timeout ->
            {fail, timeout}
    end.

If you are just trying to spawn a worker that needs to give you an answer, you might want to consider using spawn_monitor instead and using its {pid(), reference()} return as the message you're listening for in response.

As I mentioned above, the process starting the link won't die if it is trapping exits, but you really want to avoid trapping exits in most cases. As a basic rule, use process_flag(trap_exit, true) as little as possible. Getting trap_exit happy everywhere will have structural effects you won't intend eventually, and its one of the few things in Erlang that is difficult to refactor away from later.

Upvotes: 3

Pascal
Pascal

Reputation: 14042

The link is bidirectional, between the process which is calling the function start_link(Name) and the new process created by gen_fsm:start_link(?MODULE, [Name], []).

A called function is executed in the context of the calling process.

A new process is created by a spawn function. You should find it in the gen_fsm:start_link/3 code.

When a link is created, if one process exit for an other reason than normal, the linked process will die also, except if it has set process_flag(trap_exit, true) in which case it will receive the message {'EXIT',FromPid,Reason} where FromPid is the Pid of the process that came to die, and Reason the reason of termination.

Upvotes: 2

Related Questions