рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рднрд╛рдЧ 2

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рддрдВрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдЖрдЬ, рдЖрдЗрдП рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдерд╛ - рд╣рдо рдорд╛рд░ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╢реВрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд


рдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рд╕рд┐рдЧреНрдирд▓ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рд╣рдореЗрд╢рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдкреНрд░рдгрд╛рд▓реАрдЧрдд рд╣реЛред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдУрдЯреАрдкреА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдлрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ, рддреЛ рд╡рд╣ рдорд░ рдЬрд╛рддреА рд╣реИ рдФрд░ рдорд╛рд░реЗ рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЙрд╕рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдкрд░ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЪрд┐рддреНрд░ 1

рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
-module(test). -export([start/1, proc/2]). start(Sysproc) -> process_flag(trap_exit, Sysproc), io:format("Shell Pid: ~p~n", [self()]), PidA = spawn_link(test, proc, [self(), a]), PidB = spawn_link(test, proc, [self(), b]), io:format("ProcA: ~p~nProcB: ~p~n", [PidA, PidB]), exit(PidB, kill). proc(Shell, Tag) -> receive after 5000 -> Shell ! {hello_from, Tag, self()} end. 


рдкреНрд░рд╛рд░рдВрдн / 1 рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдмрдирд╛рддреЗ рд╣реИрдВ: A рдФрд░ B, proc / 2 рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдирд┐рдХрд╛рдп рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╢реЗрд▓ рдХрд╛ рдкрд┐рдб, рджреВрд╕рд░рд╛ рдЯреИрдЧ: рдкрд░рдорд╛рдгреБ () рд╣реИ, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдХрд┐рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдирд┐рдХрд╛рд╕ / 2 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмреА рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИред

рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред

 (emacs@aleksio-mobile)2> test:start(false). Shell Pid: <0.36.0> ProcA: <0.43.0> ProcB: <0.44.0> ** exception exit: killed (emacs@aleksio-mobile)3> flush(). ok (emacs@aleksio-mobile)4> self(). <0.45.0> (emacs@aleksio-mobile)5> 


рд╣рдо рдкреНрд░рд╛рд░рдВрдн / 1 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╢реЗрд▓ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдирд╣реАрдВ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ)ред рд╕реНрдкреИрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рд╣рдо "** рдЕрдкрд╡рд╛рдж рдирд┐рдХрд╛рд╕: рдорд╛рд░реЗ рдЧрдП" рд╕рдВрджреЗрд╢ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╢реЗрд▓ рдХреЛ рдорд╛рд░реЗ рдЧрдП рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде рдорд╛рд░рд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣ рдЦреЛрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣рд╛рджреБрд░ рдХреА рдореМрдд рдорд░ рдЧрдпрд╛, рдЗрд╕рдХреЗ рдирдП рдкреАрдЖрдИрдбреА тАЛтАЛ<0.45.0> рдХрд╣рддреЗ рд╣реИрдВред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЪрд┐рддреНрд░ 2

рддреНрд░реБрдЯрд┐ рд╕рднреА рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреИрд▓рддреА рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдорд░ рдЬрд╛рддреА рд╣реИрдВред рдЕрдм рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

 -module(test). -export([start/1, proc/3]). start(Sysproc) -> process_flag(trap_exit, Sysproc), io:format("Shell Pid: ~p~n", [self()]), PidA = spawn_link(test, proc, [self(), a, false]), PidB = spawn_link(test, proc, [self(), b, true]), io:format("ProcA: ~p~nProcB: ~p~n", [PidA, PidB]), exit(PidB, kill). proc(Shell, Tag, Sysproc) -> process_flag(trap_exit, Sysproc), receive after 5000 -> Shell ! {hello_from, Tag, self()} end. 


 (emacs@aleksio-mobile)2> test:start(false). Shell Pid: <0.36.0> ProcA: <0.43.0> ProcB: <0.44.0> ** exception exit: killed (emacs@aleksio-mobile)3> flush(). ok (emacs@aleksio-mobile)4> self(). <0.45.0> (emacs@aleksio-mobile)5> 


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдмреА рдХреЛ рд╕рд┐рд╕реНрдЯрдорд┐рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЪрд┐рддреНрд░ 3 рдореЗрдВ рдбрдмрд▓ рд╕рд░реНрдХрд▓), рдпрд╣ рддрдм рднреА рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдорд╛рд░реЗ рдЧрдП рд╕рд┐рдЧреНрдирд▓ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреИрд▓рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдорд░ рдЬрд╛рддреА рд╣реИрдВред


рдЪрд┐рддреНрд░ 3

рдЕрдм рд╢реЗрд▓ рд╕рд┐рд╕реНрдЯрдо рднреА рдмрдирд╛рддреЗ рд╣реИрдВред

 (emacs@aleksio-mobile)2> test:start(true). Shell Pid: <0.36.0> ProcA: <0.43.0> ProcB: <0.44.0> true (emacs@aleksio-mobile)3> flush(). Shell got {'EXIT',<0.44.0>,killed} Shell got {hello_from,a,<0.43.0>} Shell got {'EXIT',<0.43.0>,normal} ok (emacs@aleksio-mobile)4> self(). <0.36.0> (emacs@aleksio-mobile)5> 


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмреА рдХреЛ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╢реЗрд▓ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ (рд╢реЗрд▓ рдХреЛ {'EXIT', <0.44.0>, рдорд╛рд░реЗ рдЧрдП}) рдорд┐рд▓рд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдП рдиреЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдкреВрд░рд╛ рдХрд┐рдпрд╛ (рдЪрд┐рддреНрд░ 4)ред


рдЪрд┐рддреНрд░ 4

рдпрд╣ рдПрдХ рдФрд░ рдорд╛рдорд▓реЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
 -module(test). -export([start/1, proc/4]). start(Sysproc) -> process_flag(trap_exit, Sysproc), io:format("Shell Pid: ~p~n", [self()]), PidA = spawn_link(test, proc, [self(), a, true, fun() -> ok end]), PidB = spawn_link(test, proc, [self(), b, false, fun() -> exit(kill) end]), io:format("ProcA: ~p~nProcB: ~p~n", [PidA, PidB]). proc(Shell, Tag, Sysproc, F) -> process_flag(trap_exit, Sysproc), F(), receive Msg -> io:format("Proc ~p get msg: ~p.~n", [Tag, Msg]) after 5000 -> Shell ! {hello_from, Tag, self()} end. 


рдХреНрд░рдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдмреНрд▓реЙрдХ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдП рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдареАрдХ рд▓реМрдЯреЗрдЧрд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдирд┐рдХрд╛рд╕ / 1 рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рддред рдорд╛рд░ рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдмрд╛рд╣рд░ рдПрдХ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рднреЗрдЬреЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдП рд╣рдореЗрд╢рд╛ рдкреНрд░рдгрд╛рд▓реАрдЧрдд рд╣реЛрдЧреАред рдЪреЗрдХ рдЪрд▓рд╛рдПрдВред

 (emacs@aleksio-mobile)2> test:start(false). Shell Pid: <0.36.0> ProcA: <0.43.0> ProcB: <0.44.0> Proc a get msg: {'EXIT',<0.36.0>,killed}. ** exception exit: killed (emacs@aleksio-mobile)3> flush(). ok (emacs@aleksio-mobile)4> self(). <0.45.0> (emacs@aleksio-mobile)5> 


рд╣рдо рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рд░рдВрдн / 1 рдХрд╣рддреЗ рд╣реИрдВ (рд╣рдо рд╢реЗрд▓ рдХреЛ рдЧреИрд░-рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рддреЗ рд╣реИрдВ), рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд╢реЗрд▓ рдЧрд┐рд░ рдЧрдпрд╛ред рдкреНрд░реЛрд╕реЗрд╕ рдмреА рдХреЛ рдХрд┐рд▓ рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╢реЗрд▓ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╢реЗрд▓ рдЧрд┐рд░ рдЧрдпрд╛, рдлрд┐рд░ рд╕рд┐рдЧреНрдирд▓ рдП (рдкреНрд░рдХреНрд░рд┐рдпрд╛ 5) рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ред


рдЪрд┐рддреНрд░ 5

рдзреНрдпрд╛рди рджреЗрдВ рд╕рд╡рд╛рд▓! рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмреА рджреНрд╡рд╛рд░рд╛ рд╢реЗрд▓ рдХреЛ рдХреНрдпрд╛ рд╕рдВрдХреЗрдд рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЪрд┐рддреНрд░ рдореЗрдВ рддреАрди рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рд╣реИрдВ)ред рд╣рддреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ - рд╢реЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдПрдВред

 (emacs@aleksio-mobile)2> test:start(true). Shell Pid: <0.36.0> ProcA: <0.43.0> ProcB: <0.44.0> ok (emacs@aleksio-mobile)3> flush(). Shell got {'EXIT',<0.44.0>,kill} Shell got {hello_from,a,<0.43.0>} Shell got {'EXIT',<0.43.0>,normal} ok (emacs@aleksio-mobile)4> self(). <0.36.0> (emacs@aleksio-mobile)5> 


рд╢реЗрд▓ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд {'EXIT', <0.44.0>, рдорд╛рд░} рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛! рдореЗрд░реЗ рдкрд╛рд╕ рддреИрдпрд╛рд░ рдЙрддреНрддрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рд╢рд╛рдпрдж рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкрддрд╛ рд╣реИ?

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдореЙрдирд┐рдЯрд░ рдХреЗ рддрдВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╕рдВрджрд░реНрдн


1. рдЙрддреНрдХреГрд╖реНрдЯ рдСрдирд▓рд╛рдЗрди рдкреНрд░рд▓реЗрдЦрди ред
2. рдлреНрд░рд╛рдВрд╕реЗрд╕реНрдХреЛ рд╕реЗрд╕рд░рд┐рдиреА рдФрд░ рд╕рд╛рдЗрдорди рдереЙрдореНрдкрд╕рди рджреНрд╡рд╛рд░рд╛ ERLANG рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред
3. рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрд░рд▓рд╛рдВрдЧ: рдЬреЛ рдЖрд░реНрдорд╕реНрдЯреНрд░рд╛рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдорд╡рд░реНрддреА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ред

Source: https://habr.com/ru/post/In114753/


All Articles