<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="../otp_doc.css" type="text/css"> <title>Erlang -- Processes</title> </head> <body bgcolor="white" text="#000000" link="#0000ff" vlink="#ff00ff" alink="#ff0000"><div id="container"> <script id="js" type="text/javascript" language="JavaScript" src="../js/flipmenu/flipmenu.js"></script><script id="js2" type="text/javascript" src="../js/erlresolvelinks.js"></script><script language="JavaScript" type="text/javascript"> <!-- function getWinHeight() { var myHeight = 0; if( typeof( window.innerHeight ) == 'number' ) { //Non-IE myHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' myHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible myHeight = document.body.clientHeight; } return myHeight; } function setscrollpos() { var objf=document.getElementById('loadscrollpos'); document.getElementById("leftnav").scrollTop = objf.offsetTop - getWinHeight()/2; } function addEvent(obj, evType, fn){ if (obj.addEventListener){ obj.addEventListener(evType, fn, true); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else { return false; } } addEvent(window, 'load', setscrollpos); //--></script><div id="leftnav"><div class="innertube"> <img alt="Erlang logo" src="../erlang-logo.png"><br><small><a href="users_guide.html">User's Guide</a><br><a href="../pdf/otp-system-documentation-5.7.5.pdf">PDF</a><br><a href="../index.html">Top</a></small><p><strong>Erlang Reference Manual</strong><br><strong>User's Guide</strong><br><small>Version 5.7.5</small></p> <br><a href="javascript:openAllFlips()">Expand All</a><br><a href="javascript:closeAllFlips()">Contract All</a><p><small><strong>Chapters</strong></small></p> <ul class="flipMenu" imagepath="../js/flipmenu"> <li id="no" title="Introduction" expanded="false">Introduction<ul> <li><a href="introduction.html"> Top of chapter </a></li> <li title="Purpose"><a href="introduction.html#id2255253">Purpose</a></li> <li title="Prerequisites"><a href="introduction.html#id2252190">Prerequisites</a></li> <li title="Document Conventions"><a href="introduction.html#id2254389">Document Conventions</a></li> <li title="Complete List of BIFs"><a href="introduction.html#id2252818">Complete List of BIFs</a></li> <li title="Reserved Words"><a href="introduction.html#id2260827">Reserved Words</a></li> <li title="Character Set"><a href="introduction.html#id2266064">Character Set</a></li> </ul> </li> <li id="no" title="Data Types" expanded="false">Data Types<ul> <li><a href="data_types.html"> Top of chapter </a></li> <li title="Terms"><a href="data_types.html#id2265309">Terms</a></li> <li title="Number"><a href="data_types.html#id2253001">Number</a></li> <li title="Atom"><a href="data_types.html#id2259848">Atom</a></li> <li title="Bit Strings and Binaries"><a href="data_types.html#id2257844">Bit Strings and Binaries</a></li> <li title="Reference"><a href="data_types.html#id2265338">Reference</a></li> <li title="Fun"><a href="data_types.html#id2265020">Fun</a></li> <li title="Port Identifier"><a href="data_types.html#id2260799">Port Identifier</a></li> <li title="Pid"><a href="data_types.html#id2263912">Pid</a></li> <li title="Tuple"><a href="data_types.html#id2264766">Tuple</a></li> <li title="List"><a href="data_types.html#id2259788">List</a></li> <li title="String"><a href="data_types.html#id2263762">String</a></li> <li title="Record"><a href="data_types.html#id2263803">Record</a></li> <li title="Boolean"><a href="data_types.html#id2252704">Boolean</a></li> <li title="Escape Sequences"><a href="data_types.html#id2252738">Escape Sequences</a></li> <li title="Type Conversions"><a href="data_types.html#id2271721">Type Conversions</a></li> </ul> </li> <li id="no" title="Pattern Matching" expanded="false">Pattern Matching<ul> <li><a href="patterns.html"> Top of chapter </a></li> <li title="Pattern Matching"><a href="patterns.html#id2270180">Pattern Matching</a></li> </ul> </li> <li id="no" title="Modules" expanded="false">Modules<ul> <li><a href="modules.html"> Top of chapter </a></li> <li title="Module Syntax"><a href="modules.html#id2270316">Module Syntax</a></li> <li title="Module Attributes"><a href="modules.html#id2270352">Module Attributes</a></li> <li title="Comments"><a href="modules.html#id2270781">Comments</a></li> <li title="The module_info/0 and module_info/1 functions"><a href="modules.html#id2270797">The module_info/0 and module_info/1 functions</a></li> </ul> </li> <li id="no" title="Functions" expanded="false">Functions<ul> <li><a href="functions.html"> Top of chapter </a></li> <li title="Function Declaration Syntax"><a href="functions.html#id2271076">Function Declaration Syntax</a></li> <li title="Function Evaluation"><a href="functions.html#id2271201">Function Evaluation</a></li> <li title="Tail recursion"><a href="functions.html#id2271366">Tail recursion</a></li> <li title="Built-In Functions, BIFs"><a href="functions.html#id2271403">Built-In Functions, BIFs</a></li> </ul> </li> <li id="no" title="Types and Function Specifications" expanded="false">Types and Function Specifications<ul> <li><a href="typespec.html"> Top of chapter </a></li> <li title="Introduction of Types"><a href="typespec.html#id2271533">Introduction of Types</a></li> <li title="Types and their Syntax"><a href="typespec.html#id2271594">Types and their Syntax</a></li> <li title="Type declarations of user-defined types"><a href="typespec.html#id2272398">Type declarations of user-defined types</a></li> <li title=" Type information in record declarations "><a href="typespec.html#id2272454"> Type information in record declarations </a></li> <li title="Specifications (contracts) for functions"><a href="typespec.html#id2272544">Specifications (contracts) for functions</a></li> </ul> </li> <li id="no" title="Expressions" expanded="false">Expressions<ul> <li><a href="expressions.html"> Top of chapter </a></li> <li title="Expression Evaluation"><a href="expressions.html#id2272779">Expression Evaluation</a></li> <li title="Terms"><a href="expressions.html#id2272826">Terms</a></li> <li title="Variables"><a href="expressions.html#id2272840">Variables</a></li> <li title="Patterns"><a href="expressions.html#id2272985">Patterns</a></li> <li title="Match"><a href="expressions.html#id2273115">Match</a></li> <li title="Function Calls"><a href="expressions.html#id2273176">Function Calls</a></li> <li title="If"><a href="expressions.html#id2273319">If</a></li> <li title="Case"><a href="expressions.html#id2273390">Case</a></li> <li title="Send"><a href="expressions.html#id2273460">Send</a></li> <li title="Receive"><a href="expressions.html#id2273548">Receive</a></li> <li title="Term Comparisons"><a href="expressions.html#id2273735">Term Comparisons</a></li> <li title="Arithmetic Expressions"><a href="expressions.html#id2274000">Arithmetic Expressions</a></li> <li title="Boolean Expressions"><a href="expressions.html#id2274511">Boolean Expressions</a></li> <li title="Short-Circuit Expressions"><a href="expressions.html#id2274668">Short-Circuit Expressions</a></li> <li title="List Operations"><a href="expressions.html#id2274790">List Operations</a></li> <li title="Bit Syntax Expressions"><a href="expressions.html#id2274864">Bit Syntax Expressions</a></li> <li title="Fun Expressions"><a href="expressions.html#id2275447">Fun Expressions</a></li> <li title="Catch and Throw"><a href="expressions.html#id2275626">Catch and Throw</a></li> <li title="Try"><a href="expressions.html#id2275780">Try</a></li> <li title="Parenthesized Expressions"><a href="expressions.html#id2276172">Parenthesized Expressions</a></li> <li title="Block Expressions"><a href="expressions.html#id2276207">Block Expressions</a></li> <li title="List Comprehensions"><a href="expressions.html#id2276233">List Comprehensions</a></li> <li title="Bit String Comprehensions"><a href="expressions.html#id2276384">Bit String Comprehensions</a></li> <li title="Guard Sequences"><a href="expressions.html#id2276526">Guard Sequences</a></li> <li title="Operator Precedence"><a href="expressions.html#id2277066">Operator Precedence</a></li> </ul> </li> <li id="no" title="The Preprocessor" expanded="false">The Preprocessor<ul> <li><a href="macros.html"> Top of chapter </a></li> <li title="File Inclusion"><a href="macros.html#id2277395">File Inclusion</a></li> <li title="Defining and Using Macros"><a href="macros.html#id2277538">Defining and Using Macros</a></li> <li title="Predefined Macros"><a href="macros.html#id2277673">Predefined Macros</a></li> <li title="Macros Overloading"><a href="macros.html#id2277743">Macros Overloading</a></li> <li title="Flow Control in Macros"><a href="macros.html#id2277818">Flow Control in Macros</a></li> <li title="Stringifying Macro Arguments"><a href="macros.html#id2277962">Stringifying Macro Arguments</a></li> </ul> </li> <li id="no" title="Records" expanded="false">Records<ul> <li><a href="records.html"> Top of chapter </a></li> <li title="Defining Records"><a href="records.html#id2278098">Defining Records</a></li> <li title="Creating Records"><a href="records.html#id2278135">Creating Records</a></li> <li title="Accessing Record Fields"><a href="records.html#id2278197">Accessing Record Fields</a></li> <li title="Updating Records"><a href="records.html#id2278240">Updating Records</a></li> <li title="Records in Guards"><a href="records.html#id2278275">Records in Guards</a></li> <li title="Records in Patterns"><a href="records.html#id2278311">Records in Patterns</a></li> <li title="Internal Representation of Records"><a href="records.html#id2278340">Internal Representation of Records</a></li> </ul> </li> <li id="no" title="Errors and Error Handling" expanded="false">Errors and Error Handling<ul> <li><a href="errors.html"> Top of chapter </a></li> <li title="Terminology"><a href="errors.html#id2278472">Terminology</a></li> <li title="Exceptions"><a href="errors.html#id2278622">Exceptions</a></li> <li title="Handling of Run-Time Errors in Erlang"><a href="errors.html#id2278806">Handling of Run-Time Errors in Erlang</a></li> <li title="Exit Reasons"><a href="errors.html#id2278873">Exit Reasons</a></li> </ul> </li> <li id="loadscrollpos" title="Processes" expanded="true">Processes<ul> <li><a href="processes.html"> Top of chapter </a></li> <li title="Processes"><a href="processes.html#id2279365">Processes</a></li> <li title="Process Creation"><a href="processes.html#id2279380">Process Creation</a></li> <li title="Registered Processes"><a href="processes.html#id2279433">Registered Processes</a></li> <li title="Process Termination"><a href="processes.html#id2279548">Process Termination</a></li> <li title="Message Sending"><a href="processes.html#id2279644">Message Sending</a></li> <li title="Links"><a href="processes.html#id2279676">Links</a></li> <li title="Error Handling"><a href="processes.html#id2279746">Error Handling</a></li> <li title="Monitors"><a href="processes.html#id2279871">Monitors</a></li> <li title="Process Dictionary"><a href="processes.html#id2279969">Process Dictionary</a></li> </ul> </li> <li id="no" title="Distributed Erlang" expanded="false">Distributed Erlang<ul> <li><a href="distributed.html"> Top of chapter </a></li> <li title="Distributed Erlang System"><a href="distributed.html#id2280043">Distributed Erlang System</a></li> <li title="Nodes"><a href="distributed.html#id2280079">Nodes</a></li> <li title="Node Connections"><a href="distributed.html#id2280154">Node Connections</a></li> <li title="epmd"><a href="distributed.html#id2280210">epmd</a></li> <li title="Hidden Nodes"><a href="distributed.html#id2280232">Hidden Nodes</a></li> <li title="C Nodes"><a href="distributed.html#id2280285">C Nodes</a></li> <li title="Security"><a href="distributed.html#id2280311">Security</a></li> <li title="Distribution BIFs"><a href="distributed.html#id2280439">Distribution BIFs</a></li> <li title="Distribution Command Line Flags"><a href="distributed.html#id2280745">Distribution Command Line Flags</a></li> <li title="Distribution Modules"><a href="distributed.html#id2280886">Distribution Modules</a></li> </ul> </li> <li id="no" title="Compilation and Code Loading" expanded="false">Compilation and Code Loading<ul> <li><a href="code_loading.html"> Top of chapter </a></li> <li title="Compilation"><a href="code_loading.html#id2281100">Compilation</a></li> <li title="Code Loading"><a href="code_loading.html#id2281218">Code Loading</a></li> <li title="Code Replacement"><a href="code_loading.html#id2281268">Code Replacement</a></li> <li title="Running a function when a module is loaded"><a href="code_loading.html#id2281355">Running a function when a module is loaded</a></li> </ul> </li> <li id="no" title="Ports and Port Drivers" expanded="false">Ports and Port Drivers<ul> <li><a href="ports.html"> Top of chapter </a></li> <li title="Ports"><a href="ports.html#id2281515">Ports</a></li> <li title="Port Drivers"><a href="ports.html#id2281557">Port Drivers</a></li> <li title="Port BIFs"><a href="ports.html#id2281600">Port BIFs</a></li> </ul> </li> </ul> </div></div> <div id="content"> <div class="innertube"> <h1>11 Processes</h1> <h3><a name="id2279365">11.1 Processes</a></h3> <p>Erlang is designed for massive concurrency. Erlang processes are light-weight (grow and shrink dynamically) with small memory footprint, fast to create and terminate and the scheduling overhead is low.</p> <h3><a name="id2279380">11.2 Process Creation</a></h3> <p>A process is created by calling <span class="code">spawn</span>:</p> <div class="example"><pre> spawn(Module, Name, Args) -> pid() Module = Name = atom() Args = [Arg1,...,ArgN] ArgI = term()</pre></div> <p><span class="code">spawn</span> creates a new process and returns the pid.</p> <p>The new process will start executing in <span class="code">Module:Name(Arg1,...,ArgN)</span> where the arguments is the elements of the (possible empty) <span class="code">Args</span> argument list.</p> <p>There exist a number of other <span class="code">spawn</span> BIFs, for example <span class="code">spawn/4</span> for spawning a process at another node.</p> <h3><a name="id2279433">11.3 Registered Processes</a></h3> <p>Besides addressing a process by using its pid, there are also BIFs for registering a process under a name. The name must be an atom and is automatically unregistered if the process terminates:</p> <table border="1" cellpadding="2" cellspacing="0"> <tr> <td align="left" valign="middle"><span class="code">register(Name, Pid)</span></td> <td align="left" valign="middle">Associates the name <span class="code">Name</span>, an atom, with the process <span class="code">Pid</span>.</td> </tr> <tr> <td align="left" valign="middle"><span class="code">registered()</span></td> <td align="left" valign="middle">Returns a list of names which have been registered using<span class="code">register/2</span>.</td> </tr> <tr> <td align="left" valign="middle"><span class="code">whereis(Name)</span></td> <td align="left" valign="middle">Returns the pid registered under <span class="code">Name</span>, or<span class="code">undefined</span>if the name is not registered.</td> </tr> </table> <em>Table 11.1: Name Registration BIFs.</em> <h3><a name="id2279548">11.4 Process Termination</a></h3> <a name="term"></a> <p>When a process terminates, it always terminates with an <strong>exit reason</strong>. The reason may be any term.</p> <p>A process is said to terminate <strong>normally</strong>, if the exit reason is the atom <span class="code">normal</span>. A process with no more code to execute terminates normally.</p> <p>A process terminates with exit reason <span class="code">{Reason,Stack}</span> when a run-time error occurs. See <span class="bold_code"><a href="errors.html#exit_reasons">Error and Error Handling</a></span>.</p> <p>A process can terminate itself by calling one of the BIFs <span class="code">exit(Reason)</span>, <span class="code">erlang:error(Reason)</span>, <span class="code">erlang:error(Reason, Args)</span>, <span class="code">erlang:fault(Reason)</span> or <span class="code">erlang:fault(Reason, Args)</span>. The process then terminates with reason <span class="code">Reason</span> for <span class="code">exit/1</span> or <span class="code">{Reason,Stack} for the others</span>.</p> <p>A process may also be terminated if it receives an exit signal with another exit reason than <span class="code">normal</span>, see <span class="bold_code"><a href="#errors">Error Handling</a></span> below.</p> <h3><a name="id2279644">11.5 Message Sending</a></h3> <p>Processes communicate by sending and receiving messages. Messages are sent by using the <span class="bold_code"><a href="expressions.html#send">send operator !</a></span> and received by calling <span class="bold_code"><a href="expressions.html#receive">receive</a></span>.</p> <p>Message sending is asynchronous and safe, the message is guaranteed to eventually reach the recipient, provided that the recipient exists.</p> <h3><a name="id2279676">11.6 Links</a></h3> <p>Two processes can be <strong>linked</strong> to each other. A link between two processes <span class="code">Pid1</span> and <span class="code">Pid2</span> is created by <span class="code">Pid1</span> calling the BIF <span class="code">link(Pid2)</span> (or vice versa). There also exists a number a <span class="code">spawn_link</span> BIFs, which spawns and links to a process in one operation.</p> <p>Links are bidirectional and there can only be one link between two processes. Repeated calls to <span class="code">link(Pid)</span> have no effect.</p> <p>A link can be removed by calling the BIF <span class="code">unlink(Pid)</span>.</p> <p>Links are used to monitor the behaviour of other processes, see <span class="bold_code"><a href="#errors">Error Handling</a></span> below.</p> <h3><a name="id2279746">11.7 Error Handling</a></h3> <a name="errors"></a> <p>Erlang has a built-in feature for error handling between processes. Terminating processes will emit exit signals to all linked processes, which may terminate as well or handle the exit in some way. This feature can be used to build hierarchical program structures where some processes are supervising other processes, for example restarting them if they terminate abnormally.</p> <p>Refer to OTP Design Principles for more information about OTP supervision trees, which uses this feature.</p> <h4>Emitting Exit Signals</h4> <p>When a process terminates, it will terminate with an <strong>exit reason</strong> as explained in <span class="bold_code"><a href="#term">Process Termination</a></span> above. This exit reason is emitted in an <strong>exit signal</strong> to all linked processes.</p> <p>A process can also call the function <span class="code">exit(Pid,Reason)</span>. This will result in an exit signal with exit reason <span class="code">Reason</span> being emitted to <span class="code">Pid</span>, but does not affect the calling process.</p> <h4>Receiving Exit Signals</h4> <p>The default behaviour when a process receives an exit signal with an exit reason other than <span class="code">normal</span>, is to terminate and in turn emit exit signals with the same exit reason to its linked processes. An exit signal with reason <span class="code">normal</span> is ignored.</p> <p>A process can be set to trap exit signals by calling:</p> <div class="example"><pre> process_flag(trap_exit, true)</pre></div> <p>When a process is trapping exits, it will not terminate when an exit signal is received. Instead, the signal is transformed into a message <span class="code">{'EXIT',FromPid,Reason}</span> which is put into the mailbox of the process just like a regular message.</p> <p>An exception to the above is if the exit reason is <span class="code">kill</span>, that is if <span class="code">exit(Pid,kill)</span> has been called. This will unconditionally terminate the process, regardless of if it is trapping exit signals or not.</p> <h3><a name="id2279871">11.8 Monitors</a></h3> <p>An alternative to links are <strong>monitors</strong>. A process <span class="code">Pid1</span> can create a monitor for <span class="code">Pid2</span> by calling the BIF <span class="code">erlang:monitor(process, Pid2)</span>. The function returns a reference <span class="code">Ref</span>.</p> <p>If <span class="code">Pid2</span> terminates with exit reason <span class="code">Reason</span>, a 'DOWN' message is sent to <span class="code">Pid1</span>:</p> <div class="example"><pre> {'DOWN', Ref, process, Pid2, Reason}</pre></div> <p>If <span class="code">Pid2</span> does not exist, the 'DOWN' message is sent immediately with <span class="code">Reason</span> set to <span class="code">noproc</span>.</p> <p>Monitors are unidirectional. Repeated calls to <span class="code">erlang:monitor(process, Pid)</span> will create several, independent monitors and each one will send a 'DOWN' message when <span class="code">Pid</span> terminates.</p> <p>A monitor can be removed by calling <span class="code">erlang:demonitor(Ref)</span>.</p> <p>It is possible to create monitors for processes with registered names, also at other nodes.</p> <h3><a name="id2279969">11.9 Process Dictionary</a></h3> <p>Each process has its own process dictionary, accessed by calling the following BIFs:</p> <div class="example"><pre> put(Key, Value) get(Key) get() get_keys(Value) erase(Key) erase()</pre></div> </div> <div class="footer"> <hr> <p>Copyright © 2003-2010 Ericsson AB. All Rights Reserved.</p> </div> </div> </div></body> </html>