*** PROCESSES ***


Process types
-------------

As far as the init file is concerned there are 3 types of processes which
are differentiated by the I/O parameter in the init files PROCESSES section. 
These are:

Terminal processes:
    These are created by using the TERM option and this means that their
    standard I/O (the streams "STDIN" and "STDOUT") is through the tty/terminal 
    device that Avios was booted from. This are usefull for testing code or
    if you simply want to use Avios as a command line interpreter.

Background processes:
    Created using the BACK option these run in the background and the standard 
    I/O streams are not linked to any I/O channels. Trying to read or write
    to them will cause an "Unset stream" error though it can always write to
    the system log using printlog or any other stream.

Device processes:
    These processes use a character device (normally a tty driver accessing
    a terminal) as their I/O source/destination. To run a terminal on these
    you must have read/write permission on the device and since Avios does
    not prepare the device you may need to use the unix stty command to set
    it up properly beforehand (eg setting the baud rate etc).

Image processes:
    If a process has a port number as the option then an image process is
    created upon boot. What this means is that the program code is loaded
    into memory but NOT RUN and a socket is opened on the specified port.
    If something connects to that socket a copy is taken of the process
    image and THIS is run having had is standard I/O directed down the 
    socket returned from the accept() call. So for example if you set up
    a process on port 4000 you would have an image process listening on this
    port and when something connected you would still have the image listening
    but you would also have a running process too. Image processes cannot
    be killed.


The first two types of processes and any processes spawned from an image
processes are all running processes, ie they are not images.


Process status
--------------

Processes can have a number of status's which are listed below:

IMAGE:
    The process is an image process. This processes status will never change.

RUNNING: 
    The process is currently running (ie not halted) though this doesn't
    mean that its currently swapped in.

OUTPUT_WAIT:
    The process has been halted by the system as it is trying to write to 
    a message queue thats is currently locked or full.

INPUT_WAIT:
    The process is waiting for input from a blocking stream.

CHILD_DWAIT:
    The process is waiting for any of its child processes to die. This 
    is status is set by the "wait" command.

SPEC_DWAIT:
    The process is waiting for a specific process to die. This status is
    set by the "waitpid" command.

SLEEPING:
    The process is currently sleeping. This is set by the "sleep" command.

CHILD_INT:
NONCHILD_INT:
TIMER_INT:
    The process has been interrupted by a child, non-child (ie not one of its 
    own children) processes or by the timer. These states exist for a very
    short time (usually one complete iteration of the Avios main loop) so 
    you'll rarely catch a process in one of them.

EXITING:
    The process is exiting and is either counting down its exit_remain 
    count or it is waiting to send an interrupt to another process to 
    notify it of its death (ie an "interrupt <pid> with <string> on death"
    interrupt).


System dummy
------------

Process number 1 is the system dummy process. It isn't a process in the
true sense of the word as it has no code associated with it , what it does
is to act as a repository (and hence owner) of all the global system variables
such as $version etc. You cannot do anything to or with this process (including
killing it) so I will not mention it further.


Exiting
-------

If a process exits by using the exit command (which takes an exit code as an
argument) then the syslog will say the process exited with a process code.
If the process exited due to an error or it reached "endproc" in the main
procedure then the syslog will say it exited with a system code. The codes
given match the errors stored in the $error array.
   A process will also exit if its controlling socket closes but only if it
tries to do a read or write to this socket (since Avios does not actively
check socket status in the background as it would be too cpu intensive).


Processes creating new processes
--------------------------------

Processes can create new processes using either the spawn, exec or iexec
commands. These new processes can either be children of the process ie:
their parent pid is set to the creating processes pid, or orphans: their
parent pid is set to zero. They can also either be connected to the same
socket as their parent or run on the system console/terminal or run in 
the background. See the command docs for more information.