37 lines
690 B
Elixir
37 lines
690 B
Elixir
defmodule Lec4 do
|
|
def create(n \\ 4) do
|
|
Enum.map(1..n, fn _ -> parent = self(); spawn(fn -> loop(parent) end) end)
|
|
end
|
|
|
|
def info(pid) when is_pid(pid) do
|
|
case Process.info(pid, [:trap_exit, :links]) do
|
|
nil -> {pid, :dead}
|
|
x -> {pid, x}
|
|
end
|
|
end
|
|
|
|
def info(pids) when is_list(pids) do
|
|
Enum.map(pids, &info/1)
|
|
end
|
|
|
|
def trap_exit(pid) do
|
|
send(pid, :trap_exit)
|
|
end
|
|
|
|
def link(pid, other) do
|
|
send(pid, {:link, other})
|
|
end
|
|
|
|
defp loop(parent) do
|
|
receive do
|
|
:trap_exit ->
|
|
Process.flag(:trap_exit, true)
|
|
{:link, other} ->
|
|
Process.link(other)
|
|
x ->
|
|
send(parent, x)
|
|
end
|
|
loop(parent)
|
|
end
|
|
end
|