Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates > by-pkgid > 675c8c8167236dfcf8d66da674f931e8 > files > 120

erlang-doc-R15B-03.3.fc17.noarch.rpm

<!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.9.3.1.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.9.3.1</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#id73748">Purpose</a></li>
<li title="Prerequisites"><a href="introduction.html#id66106">Prerequisites</a></li>
<li title="Document Conventions"><a href="introduction.html#id67296">Document Conventions</a></li>
<li title="Complete List of BIFs"><a href="introduction.html#id68121">Complete List of BIFs</a></li>
<li title="Reserved Words"><a href="introduction.html#id60679">Reserved Words</a></li>
<li title="Character Set"><a href="introduction.html#id61758">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#id63330">Terms</a></li>
<li title="Number"><a href="data_types.html#id68697">Number</a></li>
<li title="Atom"><a href="data_types.html#id62285">Atom</a></li>
<li title="Bit Strings and Binaries"><a href="data_types.html#id68011">Bit Strings and Binaries</a></li>
<li title="Reference"><a href="data_types.html#id58120">Reference</a></li>
<li title="Fun"><a href="data_types.html#id67499">Fun</a></li>
<li title="Port Identifier"><a href="data_types.html#id69290">Port Identifier</a></li>
<li title="Pid"><a href="data_types.html#id60853">Pid</a></li>
<li title="Tuple"><a href="data_types.html#id73719">Tuple</a></li>
<li title="List"><a href="data_types.html#id73198">List</a></li>
<li title="String"><a href="data_types.html#id68626">String</a></li>
<li title="Record"><a href="data_types.html#id65682">Record</a></li>
<li title="Boolean"><a href="data_types.html#id67471">Boolean</a></li>
<li title="Escape Sequences"><a href="data_types.html#id73885">Escape Sequences</a></li>
<li title="Type Conversions"><a href="data_types.html#id69219">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#id68202">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#id68326">Module Syntax</a></li>
<li title="Module Attributes"><a href="modules.html#id68358">Module Attributes</a></li>
<li title="Comments"><a href="modules.html#id74337">Comments</a></li>
<li title="The module_info/0 and module_info/1 functions"><a href="modules.html#id74350">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#id74609">Function Declaration Syntax</a></li>
<li title="Function Evaluation"><a href="functions.html#id74724">Function Evaluation</a></li>
<li title="Tail recursion"><a href="functions.html#id74875">Tail recursion</a></li>
<li title="Built-In Functions, BIFs"><a href="functions.html#id74908">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#id75024">Introduction of Types</a></li>
<li title="Types and their Syntax"><a href="typespec.html#id75072">Types and their Syntax</a></li>
<li title="Type declarations of user-defined types"><a href="typespec.html#id75688">Type declarations of user-defined types</a></li>
<li title="Type information in record declarations"><a href="typespec.html#id75770">Type information in record declarations</a></li>
<li title="Specifications for functions"><a href="typespec.html#id75847">Specifications 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#id76067">Expression Evaluation</a></li>
<li title="Terms"><a href="expressions.html#id76110">Terms</a></li>
<li title="Variables"><a href="expressions.html#id76122">Variables</a></li>
<li title="Patterns"><a href="expressions.html#id76253">Patterns</a></li>
<li title="Match"><a href="expressions.html#id76372">Match</a></li>
<li title="Function Calls"><a href="expressions.html#id76431">Function Calls</a></li>
<li title="If"><a href="expressions.html#id76631">If</a></li>
<li title="Case"><a href="expressions.html#id76696">Case</a></li>
<li title="Send"><a href="expressions.html#id76761">Send</a></li>
<li title="Receive"><a href="expressions.html#id76844">Receive</a></li>
<li title="Term Comparisons"><a href="expressions.html#id77009">Term Comparisons</a></li>
<li title="Arithmetic Expressions"><a href="expressions.html#id77270">Arithmetic Expressions</a></li>
<li title="Boolean Expressions"><a href="expressions.html#id77776">Boolean Expressions</a></li>
<li title="Short-Circuit Expressions"><a href="expressions.html#id77931">Short-Circuit Expressions</a></li>
<li title="List Operations"><a href="expressions.html#id78047">List Operations</a></li>
<li title="Bit Syntax Expressions"><a href="expressions.html#id78116">Bit Syntax Expressions</a></li>
<li title="Fun Expressions"><a href="expressions.html#id78658">Fun Expressions</a></li>
<li title="Catch and Throw"><a href="expressions.html#id78840">Catch and Throw</a></li>
<li title="Try"><a href="expressions.html#id78986">Try</a></li>
<li title="Parenthesized Expressions"><a href="expressions.html#id79344">Parenthesized Expressions</a></li>
<li title="Block Expressions"><a href="expressions.html#id79376">Block Expressions</a></li>
<li title="List Comprehensions"><a href="expressions.html#id79401">List Comprehensions</a></li>
<li title="Bit String Comprehensions"><a href="expressions.html#id79541">Bit String Comprehensions</a></li>
<li title="Guard Sequences"><a href="expressions.html#id79673">Guard Sequences</a></li>
<li title="Operator Precedence"><a href="expressions.html#id80211">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#id80530">File Inclusion</a></li>
<li title="Defining and Using Macros"><a href="macros.html#id80659">Defining and Using Macros</a></li>
<li title="Predefined Macros"><a href="macros.html#id80782">Predefined Macros</a></li>
<li title="Macros Overloading"><a href="macros.html#id80850">Macros Overloading</a></li>
<li title="Flow Control in Macros"><a href="macros.html#id80919">Flow Control in Macros</a></li>
<li title="Stringifying Macro Arguments"><a href="macros.html#id81056">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#id81178">Defining Records</a></li>
<li title="Creating Records"><a href="records.html#id81209">Creating Records</a></li>
<li title="Accessing Record Fields"><a href="records.html#id81264">Accessing Record Fields</a></li>
<li title="Updating Records"><a href="records.html#id81303">Updating Records</a></li>
<li title="Records in Guards"><a href="records.html#id81336">Records in Guards</a></li>
<li title="Records in Patterns"><a href="records.html#id81368">Records in Patterns</a></li>
<li title="Nested records"><a href="records.html#id81395">Nested records</a></li>
<li title="Internal Representation of Records"><a href="records.html#id81430">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#id81550">Terminology</a></li>
<li title="Exceptions"><a href="errors.html#id81678">Exceptions</a></li>
<li title="Handling of Run-Time Errors in Erlang"><a href="errors.html#id81851">Handling of Run-Time Errors in Erlang</a></li>
<li title="Exit Reasons"><a href="errors.html#id81913">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#id82387">Processes</a></li>
<li title="Process Creation"><a href="processes.html#id82400">Process Creation</a></li>
<li title="Registered Processes"><a href="processes.html#id82449">Registered Processes</a></li>
<li title="Process Termination"><a href="processes.html#id82560">Process Termination</a></li>
<li title="Message Sending"><a href="processes.html#id82650">Message Sending</a></li>
<li title="Links"><a href="processes.html#id82679">Links</a></li>
<li title="Error Handling"><a href="processes.html#id82744">Error Handling</a></li>
<li title="Monitors"><a href="processes.html#id82854">Monitors</a></li>
<li title="Process Dictionary"><a href="processes.html#id82946">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#id83013">Distributed Erlang System</a></li>
<li title="Nodes"><a href="distributed.html#id83044">Nodes</a></li>
<li title="Node Connections"><a href="distributed.html#id83114">Node Connections</a></li>
<li title="epmd"><a href="distributed.html#id83164">epmd</a></li>
<li title="Hidden Nodes"><a href="distributed.html#id83184">Hidden Nodes</a></li>
<li title="C Nodes"><a href="distributed.html#id83230">C Nodes</a></li>
<li title="Security"><a href="distributed.html#id83254">Security</a></li>
<li title="Distribution BIFs"><a href="distributed.html#id83364">Distribution BIFs</a></li>
<li title="Distribution Command Line Flags"><a href="distributed.html#id83662">Distribution Command Line Flags</a></li>
<li title="Distribution Modules"><a href="distributed.html#id83799">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#id84002">Compilation</a></li>
<li title="Code Loading"><a href="code_loading.html#id84112">Code Loading</a></li>
<li title="Code Replacement"><a href="code_loading.html#id84159">Code Replacement</a></li>
<li title="Running a function when a module is loaded"><a href="code_loading.html#id84234">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#id84374">Ports</a></li>
<li title="Port Drivers"><a href="ports.html#id84409">Port Drivers</a></li>
<li title="Port BIFs"><a href="ports.html#id84449">Port BIFs</a></li>
</ul>
</li>
</ul>
</div></div>
<div id="content">
<div class="innertube">
<h1>11 Processes</h1>
  

  <h3><a name="id82387">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="id82400">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) -&gt; 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="id82449">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="id82560">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="id82650">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="id82679">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="id82744">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="id82854">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="id82946">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-2012 Ericsson AB. All Rights Reserved.</p>
</div>
</div>
</div></body>
</html>