(bookmark-get-bookmark): Add `noerror' arg.
Signal error for invalid bookmark.
(bookmark-get-bookmark-record): Undo last change.
(bookmark-store, bookmark-delete): Use new arg `noerror'.
@c -*-texinfo-*-@c This is part of the GNU Emacs Lisp Reference Manual.@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001,@c 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.@c See the file elisp.texi for copying conditions.@setfilename ../../info/processes@node Processes, Display, Abbrevs, Top@chapter Processes@cindex child process@cindex parent process@cindex subprocess@cindex process In the terminology of operating systems, a @dfn{process} is a space inwhich a program can execute. Emacs runs in a process. Emacs Lispprograms can invoke other programs in processes of their own. These arecalled @dfn{subprocesses} or @dfn{child processes} of the Emacs process,which is their @dfn{parent process}. A subprocess of Emacs may be @dfn{synchronous} or @dfn{asynchronous},depending on how it is created. When you create a synchronoussubprocess, the Lisp program waits for the subprocess to terminatebefore continuing execution. When you create an asynchronoussubprocess, it can run in parallel with the Lisp program. This kind ofsubprocess is represented within Emacs by a Lisp object which is alsocalled a ``process.'' Lisp programs can use this object to communicatewith the subprocess or to control it. For example, you can sendsignals, obtain status information, receive output from the process, orsend input to it.@defun processp objectThis function returns @code{t} if @var{object} represents an Emacssubprocess, @code{nil} otherwise.@end defun In addition to subprocesses of the current Emacs session, you canalso access other processes running on your machine. @xref{SystemProcesses}.@menu* Subprocess Creation:: Functions that start subprocesses.* Shell Arguments:: Quoting an argument to pass it to a shell.* Synchronous Processes:: Details of using synchronous subprocesses.* Asynchronous Processes:: Starting up an asynchronous subprocess.* Deleting Processes:: Eliminating an asynchronous subprocess.* Process Information:: Accessing run-status and other attributes.* Input to Processes:: Sending input to an asynchronous subprocess.* Signals to Processes:: Stopping, continuing or interrupting an asynchronous subprocess.* Output from Processes:: Collecting output from an asynchronous subprocess.* Sentinels:: Sentinels run when process run-status changes.* Query Before Exit:: Whether to query if exiting will kill a process.* System Processes:: Accessing other processes running on your system.* Transaction Queues:: Transaction-based communication with subprocesses.* Network:: Opening network connections.* Network Servers:: Network servers let Emacs accept net connections.* Datagrams:: UDP network connections.* Low-Level Network:: Lower-level but more general function to create connections and servers.* Misc Network:: Additional relevant functions for network connections.* Serial Ports:: Communicating with serial ports.* Byte Packing:: Using bindat to pack and unpack binary data.@end menu@node Subprocess Creation@section Functions that Create Subprocesses There are three primitives that create a new subprocess in which to runa program. One of them, @code{start-process}, creates an asynchronousprocess and returns a process object (@pxref{Asynchronous Processes}).The other two, @code{call-process} and @code{call-process-region},create a synchronous process and do not return a process object(@pxref{Synchronous Processes}). Synchronous and asynchronous processes are explained in the followingsections. Since the three functions are all called in a similarfashion, their common arguments are described here.@cindex execute program@cindex @code{PATH} environment variable@cindex @code{HOME} environment variable In all cases, the function's @var{program} argument specifies theprogram to be run. An error is signaled if the file is not found orcannot be executed. If the file name is relative, the variable@code{exec-path} contains a list of directories to search. Emacsinitializes @code{exec-path} when it starts up, based on the value ofthe environment variable @code{PATH}. The standard file nameconstructs, @samp{~}, @samp{.}, and @samp{..}, are interpreted asusual in @code{exec-path}, but environment variable substitutions(@samp{$HOME}, etc.) are not recognized; use@code{substitute-in-file-name} to perform them (@pxref{File NameExpansion}). @code{nil} in this list refers to@code{default-directory}. Executing a program can also try adding suffixes to the specifiedname:@defvar exec-suffixesThis variable is a list of suffixes (strings) to try adding to thespecified program file name. The list should include @code{""} if youwant the name to be tried exactly as specified. The default value issystem-dependent.@end defvar @strong{Please note:} The argument @var{program} contains only thename of the program; it may not contain any command-line arguments. Youmust use @var{args} to provide those. Each of the subprocess-creating functions has a @var{buffer-or-name}argument which specifies where the standard output from the program willgo. It should be a buffer or a buffer name; if it is a buffer name,that will create the buffer if it does not already exist. It can alsobe @code{nil}, which says to discard the output unless a filter functionhandles it. (@xref{Filter Functions}, and @ref{Read and Print}.)Normally, you should avoid having multiple processes send output to thesame buffer because their output would be intermixed randomly.@cindex program arguments All three of the subprocess-creating functions have a @code{&rest}argument, @var{args}. The @var{args} must all be strings, and they aresupplied to @var{program} as separate command line arguments. Wildcardcharacters and other shell constructs have no special meanings in thesestrings, since the strings are passed directly to the specified program. The subprocess gets its current directory from the value of@code{default-directory} (@pxref{File Name Expansion}).@cindex environment variables, subprocesses The subprocess inherits its environment from Emacs, but you canspecify overrides for it with @code{process-environment}. @xref{SystemEnvironment}.@defvar exec-directory@pindex movemailThe value of this variable is a string, the name of a directory thatcontains programs that come with GNU Emacs, programs intended for Emacsto invoke. The program @code{movemail} is an example of such a program;Rmail uses it to fetch new mail from an inbox.@end defvar@defopt exec-pathThe value of this variable is a list of directories to search forprograms to run in subprocesses. Each element is either the name of adirectory (i.e., a string), or @code{nil}, which stands for the defaultdirectory (which is the value of @code{default-directory}).@cindex program directoriesThe value of @code{exec-path} is used by @code{call-process} and@code{start-process} when the @var{program} argument is not an absolutefile name.@end defopt@node Shell Arguments@section Shell Arguments@cindex arguments for shell commands@cindex shell command arguments Lisp programs sometimes need to run a shell and give it a commandthat contains file names that were specified by the user. Theseprograms ought to be able to support any valid file name. But the shellgives special treatment to certain characters, and if these charactersoccur in the file name, they will confuse the shell. To handle thesecharacters, use the function @code{shell-quote-argument}:@defun shell-quote-argument argumentThis function returns a string which represents, in shell syntax,an argument whose actual contents are @var{argument}. It shouldwork reliably to concatenate the return value into a shell commandand then pass it to a shell for execution.Precisely what this function does depends on your operating system. Thefunction is designed to work with the syntax of your system's standardshell; if you use an unusual shell, you will need to redefine thisfunction.@example;; @r{This example shows the behavior on GNU and Unix systems.}(shell-quote-argument "foo > bar") @result{} "foo\\ \\>\\ bar";; @r{This example shows the behavior on MS-DOS and MS-Windows.}(shell-quote-argument "foo > bar") @result{} "\"foo > bar\""@end exampleHere's an example of using @code{shell-quote-argument} to constructa shell command:@example(concat "diff -c " (shell-quote-argument oldfile) " " (shell-quote-argument newfile))@end example@end defun@cindex quoting and unquoting shell command line The following two functions help creating shell commands fromindividual argument strings and taking shell command lines apart intoindividual arguments.@defun split-string-and-unquote string &optional separatorsThis function splits @var{string} into substrings at matches for theregular expression @var{separators}, like @code{split-string} does(@pxref{Creating Strings}), but it additionally removes quoting fromthe substrings. It then makes a list of the substrings and returnsit.If @var{separators} is omitted or nil, it defaults to @code{"\\s-+"},which is a regular expression that matches one or more characters withwhitespace syntax (@pxref{Syntax Class Table}).The quoting this function supports is of 2 styles: by enclosing awhole string in double quotes @code{"@dots{}"}, or by quotingindividual characters with a backslash escape @samp{\}. The latter isalso used in Lisp strings, so this function can handle those as well.@end defun@defun combine-and-quote-strings list-of-strings &optional separatorThis function concatenates @var{list-of-strings} into a single string,quoting each string in the list that needs quoting as it goes. Italso sticks the @var{separator} string in between each pair of stringsin the result, and returns that result. If @var{separator} is omittedor @code{nil}, it defaults to a blank @code{" "}.The strings in @var{list-of-strings} that need quoting are those thatinclude @var{separator} as their substring. Quoting a string enclosesit in double quotes @code{"@dots{}"}. In the simplest case, if youare consing a shell command from the individual command-linearguments, every argument that includes embedded blanks will bequoted.@end defun@node Synchronous Processes@section Creating a Synchronous Process@cindex synchronous subprocess After a @dfn{synchronous process} is created, Emacs waits for theprocess to terminate before continuing. Starting Dired on GNU orUnix@footnote{On other systems, Emacs uses a Lisp emulation of@code{ls}; see @ref{Contents of Directories}.} is an example of this: itruns @code{ls} in a synchronous process, then modifies the outputslightly. Because the process is synchronous, the entire directorylisting arrives in the buffer before Emacs tries to do anything with it. While Emacs waits for the synchronous subprocess to terminate, theuser can quit by typing @kbd{C-g}. The first @kbd{C-g} tries to killthe subprocess with a @code{SIGINT} signal; but it waits until thesubprocess actually terminates before quitting. If during that time theuser types another @kbd{C-g}, that kills the subprocess instantly with@code{SIGKILL} and quits immediately (except on MS-DOS, where killingother processes doesn't work). @xref{Quitting}. The synchronous subprocess functions return an indication of how theprocess terminated. The output from a synchronous subprocess is generally decoded using acoding system, much like text read from a file. The input sent to asubprocess by @code{call-process-region} is encoded using a codingsystem, much like text written into a file. @xref{Coding Systems}.@defun call-process program &optional infile destination display &rest argsThis function calls @var{program} in a separate process and waits forit to finish.The standard input for the process comes from file @var{infile} if@var{infile} is not @code{nil}, and from the null device otherwise.The argument @var{destination} says where to put the process output.Here are the possibilities:@table @asis@item a bufferInsert the output in that buffer, before point. This includes both thestandard output stream and the standard error stream of the process.@item a stringInsert the output in a buffer with that name, before point.@item @code{t}Insert the output in the current buffer, before point.@item @code{nil}Discard the output.@item 0Discard the output, and return @code{nil} immediately without waitingfor the subprocess to finish.In this case, the process is not truly synchronous, since it can run inparallel with Emacs; but you can think of it as synchronous in thatEmacs is essentially finished with the subprocess as soon as thisfunction returns.MS-DOS doesn't support asynchronous subprocesses, so this option doesn'twork there.@item @code{(@var{real-destination} @var{error-destination})}Keep the standard output stream separate from the standard error stream;deal with the ordinary output as specified by @var{real-destination},and dispose of the error output according to @var{error-destination}.If @var{error-destination} is @code{nil}, that means to discard theerror output, @code{t} means mix it with the ordinary output, and astring specifies a file name to redirect error output into.You can't directly specify a buffer to put the error output in; that istoo difficult to implement. But you can achieve this result by sendingthe error output to a temporary file and then inserting the file into abuffer.@end tableIf @var{display} is non-@code{nil}, then @code{call-process} redisplaysthe buffer as output is inserted. (However, if the coding system chosenfor decoding output is @code{undecided}, meaning deduce the encodingfrom the actual data, then redisplay sometimes cannot continue oncenon-@acronym{ASCII} characters are encountered. There are fundamentalreasons why it is hard to fix this; see @ref{Output from Processes}.)Otherwise the function @code{call-process} does no redisplay, and theresults become visible on the screen only when Emacs redisplays thatbuffer in the normal course of events.The remaining arguments, @var{args}, are strings that specify commandline arguments for the program.The value returned by @code{call-process} (unless you told it not towait) indicates the reason for process termination. A number gives theexit status of the subprocess; 0 means success, and any other valuemeans failure. If the process terminated with a signal,@code{call-process} returns a string describing the signal.In the examples below, the buffer @samp{foo} is current.@smallexample@group(call-process "pwd" nil t) @result{} 0---------- Buffer: foo ----------/usr/user/lewis/manual---------- Buffer: foo ----------@end group@group(call-process "grep" nil "bar" nil "lewis" "/etc/passwd") @result{} 0---------- Buffer: bar ----------lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh---------- Buffer: bar ----------@end group@end smallexampleHere is a good example of the use of @code{call-process}, which used tobe found in the definition of @code{insert-directory}:@smallexample@group(call-process insert-directory-program nil t nil @var{switches} (if full-directory-p (concat (file-name-as-directory file) ".") file))@end group@end smallexample@end defun@defun process-file program &optional infile buffer display &rest argsThis function processes files synchronously in a separate process. Itis similar to @code{call-process} but may invoke a file handler basedon the value of the variable @code{default-directory}. The currentworking directory of the subprocess is @code{default-directory}.The arguments are handled in almost the same way as for@code{call-process}, with the following differences:Some file handlers may not support all combinations and forms of thearguments @var{infile}, @var{buffer}, and @var{display}. For example,some file handlers might behave as if @var{display} were @code{nil},regardless of the value actually passed. As another example, somefile handlers might not support separating standard output and erroroutput by way of the @var{buffer} argument.If a file handler is invoked, it determines the program to run basedon the first argument @var{program}. For instance, consider that ahandler for remote files is invoked. Then the path that is used forsearching the program might be different than @code{exec-path}.The second argument @var{infile} may invoke a file handler. The filehandler could be different from the handler chosen for the@code{process-file} function itself. (For example,@code{default-directory} could be on a remote host, whereas@var{infile} is on another remote host. Or @code{default-directory}could be non-special, whereas @var{infile} is on a remote host.)If @var{buffer} is a list of the form @code{(@var{real-destination}@var{error-destination})}, and @var{error-destination} names a file,then the same remarks as for @var{infile} apply.The remaining arguments (@var{args}) will be passed to the processverbatim. Emacs is not involved in processing file names that arepresent in @var{args}. To avoid confusion, it may be best to avoidabsolute file names in @var{args}, but rather to specify all filenames as relative to @code{default-directory}. The function@code{file-relative-name} is useful for constructing such relativefile names.@end defun@defun call-process-region start end program &optional delete destination display &rest argsThis function sends the text from @var{start} to @var{end} asstandard input to a process running @var{program}. It deletes the textsent if @var{delete} is non-@code{nil}; this is useful when@var{destination} is @code{t}, to insert the output in the currentbuffer in place of the input.The arguments @var{destination} and @var{display} control what to dowith the output from the subprocess, and whether to update the displayas it comes in. For details, see the description of@code{call-process}, above. If @var{destination} is the integer 0,@code{call-process-region} discards the output and returns @code{nil}immediately, without waiting for the subprocess to finish (this onlyworks if asynchronous subprocesses are supported).The remaining arguments, @var{args}, are strings that specify commandline arguments for the program.The return value of @code{call-process-region} is just like that of@code{call-process}: @code{nil} if you told it to return withoutwaiting; otherwise, a number or string which indicates how thesubprocess terminated.In the following example, we use @code{call-process-region} to run the@code{cat} utility, with standard input being the first five charactersin buffer @samp{foo} (the word @samp{input}). @code{cat} copies itsstandard input into its standard output. Since the argument@var{destination} is @code{t}, this output is inserted in the currentbuffer.@smallexample@group---------- Buffer: foo ----------input@point{}---------- Buffer: foo ----------@end group@group(call-process-region 1 6 "cat" nil t) @result{} 0---------- Buffer: foo ----------inputinput@point{}---------- Buffer: foo ----------@end group@end smallexample The @code{shell-command-on-region} command uses@code{call-process-region} like this:@smallexample@group(call-process-region start end shell-file-name ; @r{Name of program.} nil ; @r{Do not delete region.} buffer ; @r{Send output to @code{buffer}.} nil ; @r{No redisplay during output.} "-c" command) ; @r{Arguments for the shell.}@end group@end smallexample@end defun@defun call-process-shell-command command &optional infile destination display &rest argsThis function executes the shell command @var{command} synchronouslyin a separate process. The final arguments @var{args} are additionalarguments to add at the end of @var{command}. The other argumentsare handled as in @code{call-process}.@end defun@defun process-file-shell-command command &optional infile destination display &rest argsThis function is like @code{call-process-shell-command}, but uses@code{process-file} internally. Depending on @code{default-directory},@var{command} can be executed also on remote hosts.@end defun@defun shell-command-to-string commandThis function executes @var{command} (a string) as a shell command,then returns the command's output as a string.@end defun@defun process-lines program &rest argsThis function runs @var{program} in a separate process, waits for itto finish, and returns its output as a list of strings. Each stringin the list holds a single line of text output by the program; theend-of-line characters are stripped from each line. The argumentsbeyond @var{program}, @var{args}, are strings that specifycommand-line arguments with which to run the program.If @var{program} exits with a non-zero exit status, this functionsignals an error.This function works by calling @code{call-process}, so program outputis decoded in the same way as for @code{call-process}.@end defun@node Asynchronous Processes@section Creating an Asynchronous Process@cindex asynchronous subprocess After an @dfn{asynchronous process} is created, Emacs and the subprocessboth continue running immediately. The process thereafter runsin parallel with Emacs, and the two can communicate with each otherusing the functions described in the following sections. However,communication is only partially asynchronous: Emacs sends data to theprocess only when certain functions are called, and Emacs accepts datafrom the process only when Emacs is waiting for input or for a timedelay. Here we describe how to create an asynchronous process.@defun start-process name buffer-or-name program &rest argsThis function creates a new asynchronous subprocess and starts theprogram @var{program} running in it. It returns a process object thatstands for the new subprocess in Lisp. The argument @var{name}specifies the name for the process object; if a process with this namealready exists, then @var{name} is modified (by appending @samp{<1>},etc.) to be unique. The buffer @var{buffer-or-name} is the buffer toassociate with the process.The remaining arguments, @var{args}, are strings that specify commandline arguments for the program.In the example below, the first process is started and runs (rather,sleeps) for 100 seconds. Meanwhile, the second process is started, andgiven the name @samp{my-process<1>} for the sake of uniqueness. Itinserts the directory listing at the end of the buffer @samp{foo},before the first process finishes. Then it finishes, and a message tothat effect is inserted in the buffer. Much later, the first processfinishes, and another message is inserted in the buffer for it.@smallexample@group(start-process "my-process" "foo" "sleep" "100") @result{} #<process my-process>@end group@group(start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin") @result{} #<process my-process<1>>---------- Buffer: foo ----------total 2lrwxrwxrwx 1 lewis 14 Jul 22 10:12 gnuemacs --> /emacs-rwxrwxrwx 1 lewis 19 Jul 30 21:02 lemonProcess my-process<1> finishedProcess my-process finished---------- Buffer: foo ----------@end group@end smallexample@end defun@defun start-file-process name buffer-or-name program &rest argsLike @code{start-process}, this function starts a new asynchronoussubprocess running @var{program} in it, and returns its processobject---when @code{default-directory} is not a magic file name.If @code{default-directory} is magic, the function invokes its filehandler instead. This handler ought to run @var{program}, perhaps onthe local host, perhaps on a remote host that corresponds to@code{default-directory}. In the latter case, the local part of@code{default-directory} becomes the working directory of the process.This function does not try to invoke file name handlers for@var{program} or for the @var{program-args}.Depending on the implementation of the file handler, it might not bepossible to apply @code{process-filter} or @code{process-sentinel} tothe resulting process object (@pxref{Filter Functions}, @pxref{Sentinels}).Some file handlers may not support @code{start-file-process} (forexample @code{ange-ftp-hook-function}). In such cases, the functiondoes nothing and returns @code{nil}.@end defun@defun start-process-shell-command name buffer-or-name command &rest command-argsThis function is like @code{start-process} except that it uses a shellto execute the specified command. The argument @var{command} is a shellcommand name, and @var{command-args} are the arguments for the shellcommand. The variable @code{shell-file-name} specifies which shell touse.The point of running a program through the shell, rather than directlywith @code{start-process}, is so that you can employ shell features suchas wildcards in the arguments. It follows that if you include anarbitrary user-specified arguments in the command, you should quote itwith @code{shell-quote-argument} first, so that any special shellcharacters do @emph{not} have their special shell meanings. @xref{ShellArguments}.@end defun@defun start-file-process-shell-command name buffer-or-name command &rest command-argsThis function is like @code{start-process-shell-command}, but uses@code{start-file-process} internally. By this, @var{command} can beexecuted also on remote hosts, depending on @code{default-directory}.@end defun@defvar process-connection-type@cindex pipes@cindex @acronym{PTY}sThis variable controls the type of device used to communicate withasynchronous subprocesses. If it is non-@code{nil}, then @acronym{PTY}s areused, when available. Otherwise, pipes are used.@acronym{PTY}s are usually preferable for processes visible to the user, asin Shell mode, because they allow job control (@kbd{C-c}, @kbd{C-z},etc.) to work between the process and its children, whereas pipes donot. For subprocesses used for internal purposes by programs, it isoften better to use a pipe, because they are more efficient. Inaddition, the total number of @acronym{PTY}s is limited on many systems andit is good not to waste them.The value of @code{process-connection-type} takes effect when@code{start-process} is called. So you can specify how to communicatewith one subprocess by binding the variable around the call to@code{start-process}.@smallexample@group(let ((process-connection-type nil)) ; @r{Use a pipe.} (start-process @dots{}))@end group@end smallexampleTo determine whether a given subprocess actually got a pipe or a@acronym{PTY}, use the function @code{process-tty-name} (@pxref{ProcessInformation}).@end defvar@node Deleting Processes@section Deleting Processes@cindex deleting processes @dfn{Deleting a process} disconnects Emacs immediately from thesubprocess. Processes are deleted automatically after they terminate,but not necessarily right away. You can delete a process explicitlyat any time. If you delete a terminated process explicitly before itis deleted automatically, no harm results. Deleting a runningprocess sends a signal to terminate it (and its child processes ifany), and calls the process sentinel if it has one. @xref{Sentinels}. When a process is deleted, the process object itself continues toexist as long as other Lisp objects point to it. All the Lispprimitives that work on process objects accept deleted processes, butthose that do I/O or send signals will report an error. The processmark continues to point to the same place as before, usually into abuffer where output from the process was being inserted.@defopt delete-exited-processesThis variable controls automatic deletion of processes that haveterminated (due to calling @code{exit} or to a signal). If it is@code{nil}, then they continue to exist until the user runs@code{list-processes}. Otherwise, they are deleted immediately afterthey exit.@end defopt@defun delete-process processThis function deletes a process, killing it with a @code{SIGKILL}signal. The argument may be a process, the name of a process, abuffer, or the name of a buffer. (A buffer or buffer-name stands forthe process that @code{get-buffer-process} returns.) Calling@code{delete-process} on a running process terminates it, updates theprocess status, and runs the sentinel (if any) immediately. If theprocess has already terminated, calling @code{delete-process} has noeffect on its status, or on the running of its sentinel (which willhappen sooner or later).@smallexample@group(delete-process "*shell*") @result{} nil@end group@end smallexample@end defun@node Process Information@section Process Information Several functions return information about processes.@code{list-processes} is provided for interactive use.@deffn Command list-processes &optional query-onlyThis command displays a listing of all living processes. In addition,it finally deletes any process whose status was @samp{Exited} or@samp{Signaled}. It returns @code{nil}.If @var{query-only} is non-@code{nil} then it lists only processeswhose query flag is non-@code{nil}. @xref{Query Before Exit}.@end deffn@defun process-listThis function returns a list of all processes that have not been deleted.@smallexample@group(process-list) @result{} (#<process display-time> #<process shell>)@end group@end smallexample@end defun@defun get-process nameThis function returns the process named @var{name}, or @code{nil} ifthere is none. An error is signaled if @var{name} is not a string.@smallexample@group(get-process "shell") @result{} #<process shell>@end group@end smallexample@end defun@defun process-command processThis function returns the command that was executed to start@var{process}. This is a list of strings, the first string being theprogram executed and the rest of the strings being the arguments thatwere given to the program.@smallexample@group(process-command (get-process "shell")) @result{} ("/bin/csh" "-i")@end group@end smallexample@end defun@defun process-contact process &optional keyThis function returns information about how a network or serialprocess was set up. For a network process, when @var{key} is@code{nil}, it returns @code{(@var{hostname} @var{service})} whichspecifies what you connected to. For a serial process, when @var{key}is @code{nil}, it returns @code{(@var{port} @var{speed})}. For anordinary child process, this function always returns @code{t}.If @var{key} is @code{t}, the value is the complete status informationfor the connection, server, or serial port; that is, the list ofkeywords and values specified in @code{make-network-process} or@code{make-serial-process}, except that some of the values representthe current status instead of what you specified.For a network process:@table @code@item :bufferThe associated value is the process buffer.@item :filterThe associated value is the process filter function.@item :sentinelThe associated value is the process sentinel function.@item :remoteIn a connection, the address in internal format of the remote peer.@item :localThe local address, in internal format.@item :serviceIn a server, if you specified @code{t} for @var{service},this value is the actual port number.@end table@code{:local} and @code{:remote} are included even if they were notspecified explicitly in @code{make-network-process}.For a serial process, see @code{make-serial-process} and@code{serial-process-configure} for a list of keys.If @var{key} is a keyword, the function returns the value correspondingto that keyword.@end defun@defun process-id processThis function returns the @acronym{PID} of @var{process}. This is aninteger that distinguishes the process @var{process} from all otherprocesses running on the same computer at the current time. The@acronym{PID} of a process is chosen by the operating system kernel when theprocess is started and remains constant as long as the process exists.@end defun@defun process-name processThis function returns the name of @var{process}.@end defun@defun process-status process-nameThis function returns the status of @var{process-name} as a symbol.The argument @var{process-name} must be a process, a buffer, or aprocess name (a string).The possible values for an actual subprocess are:@table @code@item runfor a process that is running.@item stopfor a process that is stopped but continuable.@item exitfor a process that has exited.@item signalfor a process that has received a fatal signal.@item openfor a network connection that is open.@item closedfor a network connection that is closed. Once a connectionis closed, you cannot reopen it, though you might be able to opena new connection to the same place.@item connectfor a non-blocking connection that is waiting to complete.@item failedfor a non-blocking connection that has failed to complete.@item listenfor a network server that is listening.@item nilif @var{process-name} is not the name of an existing process.@end table@smallexample@group(process-status (get-buffer "*shell*")) @result{} run@end group@groupx @result{} #<process xx<1>>(process-status x) @result{} exit@end group@end smallexampleFor a network connection, @code{process-status} returns one of the symbols@code{open} or @code{closed}. The latter means that the other sideclosed the connection, or Emacs did @code{delete-process}.@end defun@defun process-type processThis function returns the symbol @code{network} for a networkconnection or server, @code{serial} for a serial port connection, or@code{real} for a real subprocess.@end defun@defun process-exit-status processThis function returns the exit status of @var{process} or the signalnumber that killed it. (Use the result of @code{process-status} todetermine which of those it is.) If @var{process} has not yetterminated, the value is 0.@end defun@defun process-tty-name processThis function returns the terminal name that @var{process} is using forits communication with Emacs---or @code{nil} if it is using pipesinstead of a terminal (see @code{process-connection-type} in@ref{Asynchronous Processes}).@end defun@defun process-coding-system process@anchor{Coding systems for a subprocess}This function returns a cons cell describing the coding systems in usefor decoding output from @var{process} and for encoding input to@var{process} (@pxref{Coding Systems}). The value has this form:@example(@var{coding-system-for-decoding} . @var{coding-system-for-encoding})@end example@end defun@defun set-process-coding-system process &optional decoding-system encoding-systemThis function specifies the coding systems to use for subsequent outputfrom and input to @var{process}. It will use @var{decoding-system} todecode subprocess output, and @var{encoding-system} to encode subprocessinput.@end defun Every process also has a property list that you can use to storemiscellaneous values associated with the process.@defun process-get process propnameThis function returns the value of the @var{propname} propertyof @var{process}.@end defun@defun process-put process propname valueThis function sets the value of the @var{propname} propertyof @var{process} to @var{value}.@end defun@defun process-plist processThis function returns the process plist of @var{process}.@end defun@defun set-process-plist process plistThis function sets the process plist of @var{process} to @var{plist}.@end defun@node Input to Processes@section Sending Input to Processes@cindex process input Asynchronous subprocesses receive input when it is sent to them byEmacs, which is done with the functions in this section. You mustspecify the process to send input to, and the input data to send. Thedata appears on the ``standard input'' of the subprocess. Some operating systems have limited space for buffered input in a@acronym{PTY}. On these systems, Emacs sends an @acronym{EOF}periodically amidst the other characters, to force them through. Formost programs, these @acronym{EOF}s do no harm. Subprocess input is normally encoded using a coding system before thesubprocess receives it, much like text written into a file. You can use@code{set-process-coding-system} to specify which coding system to use(@pxref{Process Information}). Otherwise, the coding system comes from@code{coding-system-for-write}, if that is non-@code{nil}; or else fromthe defaulting mechanism (@pxref{Default Coding Systems}). Sometimes the system is unable to accept input for that process,because the input buffer is full. When this happens, the send functionswait a short while, accepting output from subprocesses, and then tryagain. This gives the subprocess a chance to read more of its pendinginput and make space in the buffer. It also allows filters, sentinelsand timers to run---so take account of that in writing your code. In these functions, the @var{process} argument can be a process orthe name of a process, or a buffer or buffer name (which standsfor a process via @code{get-buffer-process}). @code{nil} meansthe current buffer's process.@defun process-send-string process stringThis function sends @var{process} the contents of @var{string} asstandard input. If it is @code{nil}, the current buffer's process is used. The function returns @code{nil}.@smallexample@group(process-send-string "shell<1>" "ls\n") @result{} nil@end group@group---------- Buffer: *shell* ----------...introduction.texi syntax-tables.texi~introduction.texi~ text.texiintroduction.txt text.texi~...---------- Buffer: *shell* ----------@end group@end smallexample@end defun@defun process-send-region process start endThis function sends the text in the region defined by @var{start} and@var{end} as standard input to @var{process}.An error is signaled unless both @var{start} and @var{end} areintegers or markers that indicate positions in the current buffer. (Itis unimportant which number is larger.)@end defun@defun process-send-eof &optional processThis function makes @var{process} see an end-of-file in itsinput. The @acronym{EOF} comes after any text already sent to it.The function returns @var{process}.@smallexample@group(process-send-eof "shell") @result{} "shell"@end group@end smallexample@end defun@defun process-running-child-p processThis function will tell you whether a subprocess has given control ofits terminal to its own child process. The value is @code{t} if this istrue, or if Emacs cannot tell; it is @code{nil} if Emacs can be certainthat this is not so.@end defun@node Signals to Processes@section Sending Signals to Processes@cindex process signals@cindex sending signals@cindex signals @dfn{Sending a signal} to a subprocess is a way of interrupting itsactivities. There are several different signals, each with its ownmeaning. The set of signals and their names is defined by the operatingsystem. For example, the signal @code{SIGINT} means that the user hastyped @kbd{C-c}, or that some analogous thing has happened. Each signal has a standard effect on the subprocess. Most signalskill the subprocess, but some stop or resume execution instead. Mostsignals can optionally be handled by programs; if the program handlesthe signal, then we can say nothing in general about its effects. You can send signals explicitly by calling the functions in thissection. Emacs also sends signals automatically at certain times:killing a buffer sends a @code{SIGHUP} signal to all its associatedprocesses; killing Emacs sends a @code{SIGHUP} signal to all remainingprocesses. (@code{SIGHUP} is a signal that usually indicates that theuser hung up the phone.) Each of the signal-sending functions takes two optional arguments:@var{process} and @var{current-group}. The argument @var{process} must be either a process, a processname, a buffer, a buffer name, or @code{nil}. A buffer or buffer namestands for a process through @code{get-buffer-process}. @code{nil}stands for the process associated with the current buffer. An erroris signaled if @var{process} does not identify a process. The argument @var{current-group} is a flag that makes a differencewhen you are running a job-control shell as an Emacs subprocess. If itis non-@code{nil}, then the signal is sent to the current process-groupof the terminal that Emacs uses to communicate with the subprocess. Ifthe process is a job-control shell, this means the shell's currentsubjob. If it is @code{nil}, the signal is sent to the process group ofthe immediate subprocess of Emacs. If the subprocess is a job-controlshell, this is the shell itself. The flag @var{current-group} has no effect when a pipe is used tocommunicate with the subprocess, because the operating system does notsupport the distinction in the case of pipes. For the same reason,job-control shells won't work when a pipe is used. See@code{process-connection-type} in @ref{Asynchronous Processes}.@defun interrupt-process &optional process current-groupThis function interrupts the process @var{process} by sending thesignal @code{SIGINT}. Outside of Emacs, typing the ``interruptcharacter'' (normally @kbd{C-c} on some systems, and @code{DEL} onothers) sends this signal. When the argument @var{current-group} isnon-@code{nil}, you can think of this function as ``typing @kbd{C-c}''on the terminal by which Emacs talks to the subprocess.@end defun@defun kill-process &optional process current-groupThis function kills the process @var{process} by sending thesignal @code{SIGKILL}. This signal kills the subprocess immediately,and cannot be handled by the subprocess.@end defun@defun quit-process &optional process current-groupThis function sends the signal @code{SIGQUIT} to the process@var{process}. This signal is the one sent by the ``quitcharacter'' (usually @kbd{C-b} or @kbd{C-\}) when you are not insideEmacs.@end defun@defun stop-process &optional process current-groupThis function stops the process @var{process} by sending thesignal @code{SIGTSTP}. Use @code{continue-process} to resume itsexecution.Outside of Emacs, on systems with job control, the ``stop character''(usually @kbd{C-z}) normally sends this signal. When@var{current-group} is non-@code{nil}, you can think of this function as``typing @kbd{C-z}'' on the terminal Emacs uses to communicate with thesubprocess.@end defun@defun continue-process &optional process current-groupThis function resumes execution of the process @var{process} by sendingit the signal @code{SIGCONT}. This presumes that @var{process} wasstopped previously.@end defun@c Emacs 19 feature@defun signal-process process signalThis function sends a signal to process @var{process}. The argument@var{signal} specifies which signal to send; it should be an integer.The @var{process} argument can be a system process @acronym{ID}; thatallows you to send signals to processes that are not children ofEmacs. @xref{System Processes}.@end defun@node Output from Processes@section Receiving Output from Processes@cindex process output@cindex output from processes There are two ways to receive the output that a subprocess writes toits standard output stream. The output can be inserted in a buffer,which is called the associated buffer of the process, or a functioncalled the @dfn{filter function} can be called to act on the output. Ifthe process has no buffer and no filter function, its output isdiscarded. When a subprocess terminates, Emacs reads any pending output,then stops reading output from that subprocess. Therefore, if thesubprocess has children that are still live and still producingoutput, Emacs won't receive that output. Output from a subprocess can arrive only while Emacs is waiting: whenreading terminal input, in @code{sit-for} and @code{sleep-for}(@pxref{Waiting}), and in @code{accept-process-output} (@pxref{AcceptingOutput}). This minimizes the problem of timing errors that usuallyplague parallel programming. For example, you can safely create aprocess and only then specify its buffer or filter function; no outputcan arrive before you finish, if the code in between does not call anyprimitive that waits.@defvar process-adaptive-read-bufferingOn some systems, when Emacs reads the output from a subprocess, theoutput data is read in very small blocks, potentially resulting invery poor performance. This behavior can be remedied to some extentby setting the variable @var{process-adaptive-read-buffering} to anon-@code{nil} value (the default), as it will automatically delay readingfrom such processes, thus allowing them to produce more output beforeEmacs tries to read it.@end defvar It is impossible to separate the standard output and standard errorstreams of the subprocess, because Emacs normally spawns the subprocessinside a pseudo-TTY, and a pseudo-TTY has only one output channel. Ifyou want to keep the output to those streams separate, you shouldredirect one of them to a file---for example, by using an appropriateshell command.@menu* Process Buffers:: If no filter, output is put in a buffer.* Filter Functions:: Filter functions accept output from the process.* Decoding Output:: Filters can get unibyte or multibyte strings.* Accepting Output:: How to wait until process output arrives.@end menu@node Process Buffers@subsection Process Buffers A process can (and usually does) have an @dfn{associated buffer},which is an ordinary Emacs buffer that is used for two purposes: storingthe output from the process, and deciding when to kill the process. Youcan also use the buffer to identify a process to operate on, since innormal practice only one process is associated with any given buffer.Many applications of processes also use the buffer for editing input tobe sent to the process, but this is not built into Emacs Lisp. Unless the process has a filter function (@pxref{Filter Functions}),its output is inserted in the associated buffer. The position to insertthe output is determined by the @code{process-mark}, which is thenupdated to point to the end of the text just inserted. Usually, but notalways, the @code{process-mark} is at the end of the buffer.@defun process-buffer processThis function returns the associated buffer of the process@var{process}.@smallexample@group(process-buffer (get-process "shell")) @result{} #<buffer *shell*>@end group@end smallexample@end defun@defun process-mark processThis function returns the process marker for @var{process}, which is themarker that says where to insert output from the process.If @var{process} does not have a buffer, @code{process-mark} returns amarker that points nowhere.Insertion of process output in a buffer uses this marker to decide whereto insert, and updates it to point after the inserted text. That is whysuccessive batches of output are inserted consecutively.Filter functions normally should use this marker in the same fashionas is done by direct insertion of output in the buffer. A goodexample of a filter function that uses @code{process-mark} is found atthe end of the following section.When the user is expected to enter input in the process buffer fortransmission to the process, the process marker separates the new inputfrom previous output.@end defun@defun set-process-buffer process bufferThis function sets the buffer associated with @var{process} to@var{buffer}. If @var{buffer} is @code{nil}, the process becomesassociated with no buffer.@end defun@defun get-buffer-process buffer-or-nameThis function returns a nondeleted process associated with the bufferspecified by @var{buffer-or-name}. If there are several processesassociated with it, this function chooses one (currently, the one mostrecently created, but don't count on that). Deletion of a process(see @code{delete-process}) makes it ineligible for this function toreturn.It is usually a bad idea to have more than one process associated withthe same buffer.@smallexample@group(get-buffer-process "*shell*") @result{} #<process shell>@end group@end smallexampleKilling the process's buffer deletes the process, which kills thesubprocess with a @code{SIGHUP} signal (@pxref{Signals to Processes}).@end defun@node Filter Functions@subsection Process Filter Functions@cindex filter function@cindex process filter A process @dfn{filter function} is a function that receives thestandard output from the associated process. If a process has a filter,then @emph{all} output from that process is passed to the filter. Theprocess buffer is used directly for output from the process only whenthere is no filter. The filter function can only be called when Emacs is waiting forsomething, because process output arrives only at such times. Emacswaits when reading terminal input, in @code{sit-for} and@code{sleep-for} (@pxref{Waiting}), and in @code{accept-process-output}(@pxref{Accepting Output}). A filter function must accept two arguments: the associated processand a string, which is output just received from it. The function isthen free to do whatever it chooses with the output. Quitting is normally inhibited within a filter function---otherwise,the effect of typing @kbd{C-g} at command level or to quit a usercommand would be unpredictable. If you want to permit quitting insidea filter function, bind @code{inhibit-quit} to @code{nil}. In mostcases, the right way to do this is with the macro@code{with-local-quit}. @xref{Quitting}. If an error happens during execution of a filter function, it iscaught automatically, so that it doesn't stop the execution of whateverprogram was running when the filter function was started. However, if@code{debug-on-error} is non-@code{nil}, the error-catching is turnedoff. This makes it possible to use the Lisp debugger to debug thefilter function. @xref{Debugger}. Many filter functions sometimes or always insert the text in theprocess's buffer, mimicking the actions of Emacs when there is nofilter. Such filter functions need to use @code{set-buffer} in order tobe sure to insert in that buffer. To avoid setting the current buffersemipermanently, these filter functions must save and restore thecurrent buffer. They should also update the process marker, and in somecases update the value of point. Here is how to do these things:@smallexample@group(defun ordinary-insertion-filter (proc string) (with-current-buffer (process-buffer proc) (let ((moving (= (point) (process-mark proc))))@end group@group (save-excursion ;; @r{Insert the text, advancing the process marker.} (goto-char (process-mark proc)) (insert string) (set-marker (process-mark proc) (point))) (if moving (goto-char (process-mark proc))))))@end group@end smallexample@noindentThe reason to use @code{with-current-buffer}, rather than using@code{save-excursion} to save and restore the current buffer, is so asto preserve the change in point made by the second call to@code{goto-char}. To make the filter force the process buffer to be visible whenever newtext arrives, insert the following line just before the@code{with-current-buffer} construct:@smallexample(display-buffer (process-buffer proc))@end smallexample To force point to the end of the new output, no matter where it waspreviously, eliminate the variable @code{moving} and call@code{goto-char} unconditionally. In earlier Emacs versions, every filter function that did regularexpression searching or matching had to explicitly save and restore thematch data. Now Emacs does this automatically for filter functions;they never need to do it explicitly. @xref{Match Data}. A filter function that writes the output into the buffer of theprocess should check whether the buffer is still alive. If it tries toinsert into a dead buffer, it will get an error. The expression@code{(buffer-name (process-buffer @var{process}))} returns @code{nil}if the buffer is dead. The output to the function may come in chunks of any size. A programthat produces the same output twice in a row may send it as one batch of200 characters one time, and five batches of 40 characters the next. Ifthe filter looks for certain text strings in the subprocess output, makesure to handle the case where one of these strings is split across twoor more batches of output.@defun set-process-filter process filterThis function gives @var{process} the filter function @var{filter}. If@var{filter} is @code{nil}, it gives the process no filter.@end defun@defun process-filter processThis function returns the filter function of @var{process}, or @code{nil}if it has none.@end defun Here is an example of use of a filter function:@smallexample@group(defun keep-output (process output) (setq kept (cons output kept))) @result{} keep-output@end group@group(setq kept nil) @result{} nil@end group@group(set-process-filter (get-process "shell") 'keep-output) @result{} keep-output@end group@group(process-send-string "shell" "ls ~/other\n") @result{} nilkept @result{} ("lewis@@slug[8] % "@end group@group"FINAL-W87-SHORT.MSS backup.otl kolstad.mss~address.txt backup.psf kolstad.psfbackup.bib~ david.mss resume-Dec-86.mss~backup.err david.psf resume-Dec.psfbackup.mss dland syllabus.mss""#backups.mss# backup.mss~ kolstad.mss")@end group@end smallexample@ignore @c The code in this example doesn't show the right way to do things.Here is another, more realistic example, which demonstrates how to usethe process mark to do insertion in the same fashion as is done whenthere is no filter function:@smallexample@group;; @r{Insert input in the buffer specified by @code{my-shell-buffer}};; @r{and make sure that buffer is shown in some window.}(defun my-process-filter (proc str) (let ((cur (selected-window)) (pop-up-windows t)) (pop-to-buffer my-shell-buffer)@end group@group (goto-char (point-max)) (insert str) (set-marker (process-mark proc) (point-max)) (select-window cur)))@end group@end smallexample@end ignore@node Decoding Output@subsection Decoding Process Output@cindex decode process output When Emacs writes process output directly into a multibyte buffer,it decodes the output according to the process output coding system.If the coding system is @code{raw-text} or @code{no-conversion}, Emacsconverts the unibyte output to multibyte using@code{string-to-multibyte}, and inserts the resulting multibyte text. You can use @code{set-process-coding-system} to specify which codingsystem to use (@pxref{Process Information}). Otherwise, the codingsystem comes from @code{coding-system-for-read}, if that isnon-@code{nil}; or else from the defaulting mechanism (@pxref{DefaultCoding Systems}). @strong{Warning:} Coding systems such as @code{undecided} whichdetermine the coding system from the data do not work entirelyreliably with asynchronous subprocess output. This is because Emacshas to process asynchronous subprocess output in batches, as itarrives. Emacs must try to detect the proper coding system from onebatch at a time, and this does not always work. Therefore, if at allpossible, specify a coding system that determines both the charactercode conversion and the end of line conversion---that is, one like@code{latin-1-unix}, rather than @code{undecided} or @code{latin-1}.@c Let's keep the index entries that were there for@c set-process-filter-multibyte and process-filter-multibyte-p,@cindex filter multibyte flag, of process@cindex process filter multibyte flag When Emacs calls a process filter function, it provides the processoutput as a multibyte string or as a unibyte string according to theprocess's filter coding system. Emacsdecodes the output according to the process output coding system,which usually produces a multibyte string, except for coding systemssuch as @code{binary} and @code{raw-text}@node Accepting Output@subsection Accepting Output from Processes@cindex accept input from processes Output from asynchronous subprocesses normally arrives only whileEmacs is waiting for some sort of external event, such as elapsed timeor terminal input. Occasionally it is useful in a Lisp program toexplicitly permit output to arrive at a specific point, or even to waituntil output arrives from a process.@defun accept-process-output &optional process seconds millisec just-this-oneThis function allows Emacs to read pending output from processes. Theoutput is inserted in the associated buffers or given to their filterfunctions. If @var{process} is non-@code{nil} then this function doesnot return until some output has been received from @var{process}.@c Emacs 19 featureThe arguments @var{seconds} and @var{millisec} let you specify timeoutperiods. The former specifies a period measured in seconds and thelatter specifies one measured in milliseconds. The two time periodsthus specified are added together, and @code{accept-process-output}returns after that much time, whether or not there has been anysubprocess output.The argument @var{millisec} is semi-obsolete nowadays because@var{seconds} can be a floating point number to specify waiting afractional number of seconds. If @var{seconds} is 0, the functionaccepts whatever output is pending but does not wait.@c Emacs 22.1 featureIf @var{process} is a process, and the argument @var{just-this-one} isnon-@code{nil}, only output from that process is handled, suspending outputfrom other processes until some output has been received from thatprocess or the timeout expires. If @var{just-this-one} is an integer,also inhibit running timers. This feature is generally notrecommended, but may be necessary for specific applications, such asspeech synthesis.The function @code{accept-process-output} returns non-@code{nil} if itdid get some output, or @code{nil} if the timeout expired before outputarrived.@end defun@node Sentinels@section Sentinels: Detecting Process Status Changes@cindex process sentinel@cindex sentinel (of process) A @dfn{process sentinel} is a function that is called whenever theassociated process changes status for any reason, including signals(whether sent by Emacs or caused by the process's own actions) thatterminate, stop, or continue the process. The process sentinel isalso called if the process exits. The sentinel receives twoarguments: the process for which the event occurred, and a stringdescribing the type of event. The string describing the event looks like one of the following:@itemize @bullet@item@code{"finished\n"}.@item@code{"exited abnormally with code @var{exitcode}\n"}.@item@code{"@var{name-of-signal}\n"}.@item@code{"@var{name-of-signal} (core dumped)\n"}.@end itemize A sentinel runs only while Emacs is waiting (e.g., for terminalinput, or for time to elapse, or for process output). This avoids thetiming errors that could result from running them at random places inthe middle of other Lisp programs. A program can wait, so thatsentinels will run, by calling @code{sit-for} or @code{sleep-for}(@pxref{Waiting}), or @code{accept-process-output} (@pxref{AcceptingOutput}). Emacs also allows sentinels to run when the command loop isreading input. @code{delete-process} calls the sentinel when itterminates a running process. Emacs does not keep a queue of multiple reasons to call the sentinelof one process; it records just the current status and the fact thatthere has been a change. Therefore two changes in status, coming inquick succession, can call the sentinel just once. However, processtermination will always run the sentinel exactly once. This isbecause the process status can't change again after termination. Emacs explicitly checks for output from the process before runningthe process sentinel. Once the sentinel runs due to processtermination, no further output can arrive from the process. A sentinel that writes the output into the buffer of the processshould check whether the buffer is still alive. If it tries to insertinto a dead buffer, it will get an error. If the buffer is dead,@code{(buffer-name (process-buffer @var{process}))} returns @code{nil}. Quitting is normally inhibited within a sentinel---otherwise, theeffect of typing @kbd{C-g} at command level or to quit a user commandwould be unpredictable. If you want to permit quitting inside asentinel, bind @code{inhibit-quit} to @code{nil}. In most cases, theright way to do this is with the macro @code{with-local-quit}.@xref{Quitting}. If an error happens during execution of a sentinel, it is caughtautomatically, so that it doesn't stop the execution of whateverprograms was running when the sentinel was started. However, if@code{debug-on-error} is non-@code{nil}, the error-catching is turnedoff. This makes it possible to use the Lisp debugger to debug thesentinel. @xref{Debugger}. While a sentinel is running, the process sentinel is temporarilyset to @code{nil} so that the sentinel won't run recursively.For this reason it is not possible for a sentinel to specifya new sentinel. In earlier Emacs versions, every sentinel that did regular expressionsearching or matching had to explicitly save and restore the match data.Now Emacs does this automatically for sentinels; they never need to doit explicitly. @xref{Match Data}.@defun set-process-sentinel process sentinelThis function associates @var{sentinel} with @var{process}. If@var{sentinel} is @code{nil}, then the process will have no sentinel.The default behavior when there is no sentinel is to insert a message inthe process's buffer when the process status changes.Changes in process sentinel take effect immediately---if the sentinelis slated to be run but has not been called yet, and you specify a newsentinel, the eventual call to the sentinel will use the new one.@smallexample@group(defun msg-me (process event) (princ (format "Process: %s had the event `%s'" process event)))(set-process-sentinel (get-process "shell") 'msg-me) @result{} msg-me@end group@group(kill-process (get-process "shell")) @print{} Process: #<process shell> had the event `killed' @result{} #<process shell>@end group@end smallexample@end defun@defun process-sentinel processThis function returns the sentinel of @var{process}, or @code{nil} if ithas none.@end defun@defun waiting-for-user-input-pWhile a sentinel or filter function is running, this function returnsnon-@code{nil} if Emacs was waiting for keyboard input from the user atthe time the sentinel or filter function was called, @code{nil} if itwas not.@end defun@node Query Before Exit@section Querying Before Exit When Emacs exits, it terminates all its subprocesses by sending themthe @code{SIGHUP} signal. Because subprocesses may be doingvaluable work, Emacs normally asks the user to confirm that it is okto terminate them. Each process has a query flag which, ifnon-@code{nil}, says that Emacs should ask for confirmation beforeexiting and thus killing that process. The default for the query flagis @code{t}, meaning @emph{do} query.@defun process-query-on-exit-flag processThis returns the query flag of @var{process}.@end defun@defun set-process-query-on-exit-flag process flagThis function sets the query flag of @var{process} to @var{flag}. Itreturns @var{flag}.@smallexample@group;; @r{Don't query about the shell process}(set-process-query-on-exit-flag (get-process "shell") nil) @result{} t@end group@end smallexample@end defun@defun process-kill-without-query process &optional do-queryThis function clears the query flag of @var{process}, so thatEmacs will not query the user on account of that process.Actually, the function does more than that: it returns the old value ofthe process's query flag, and sets the query flag to @var{do-query}.Please don't use this function to do those things any more---pleaseuse the newer, cleaner functions @code{process-query-on-exit-flag} and@code{set-process-query-on-exit-flag} in all but the simplest cases.The only way you should use @code{process-kill-without-query} nowadaysis like this:@smallexample@group;; @r{Don't query about the shell process}(process-kill-without-query (get-process "shell"))@end group@end smallexample@end defun@node System Processes@section Accessing Other Processes@cindex system processes In addition to accessing and manipulating processes that aresubprocesses of the current Emacs session, Emacs Lisp programs canalso access other processes running on the same machine. We callthese @dfn{system processes}, to distinguish between them and Emacssubprocesses. Emacs provides several primitives for accessing system processes.Not all platforms support these primitives; on those which don't,these primitives return @code{nil}.@defun list-system-processesThis function returns a list of all the processes running on thesystem. Each process is identified by its @acronym{PID}, a numericalprocess ID that is assigned by the OS and distinguishes the processfrom all the other processes running on the same machine at the sametime.@end defun@defun system-process-attributes pidThis function returns an alist of attributes for the process specifiedby its process ID @var{pid}. Each association in the alist is of theform @code{(@var{key} . @var{value})}, where @var{key} designates theattribute and @var{value} is the value of that attribute. The variousattribute @var{key}'s that this function can return are listed below.Not all platforms support all of these attributes; if an attribute isnot supported, its association will not appear in the returned alist.Values that are numbers can be either integer or floating-point,depending on the magnitude of the value.@table @code@item euidThe effective user ID of the user who invoked the process. Thecorresponding @var{value} is a number. If the process was invoked bythe same user who runs the current Emacs session, the value isidentical to what @code{user-uid} returns (@pxref{UserIdentification}).@item userUser name corresponding to the process's effective user ID, a string.@item egidThe group ID of the effective user ID, a number.@item groupGroup name corresponding to the effective user's group ID, a string.@item commThe name of the command that runs in the process. This is a stringthat usually specifies the name of the executable file of the process,without the leading directories. However, some special systemprocesses can report strings that do not correspond to an executablefile of a program.@item stateThe state code of the process. This is a short string that encodesthe scheduling state of the process. Here's a list of the mostfrequently seen codes:@table @code@item "D"uninterruptible sleep (usually I/O)@item "R"running@item "S"interruptible sleep (waiting for some event)@item "T"stopped, e.g., by a job control signal@item "Z"``zombie'': a process that terminated, but was not reaped by its parent@end table@noindentFor the full list of the possible states, see the manual page of the@command{ps} command.@item ppidThe process ID of the parent process, a number.@item pgrpThe process group ID of the process, a number.@item sessThe session ID of the process. This is a number that is the processID of the process's @dfn{session leader}.@item ttnameA string that is the name of the process's controlling terminal. OnUnix and GNU systems, this is normally the file name of thecorresponding terminal device, such as @file{/dev/pts65}.@item tpgidThe numerical process group ID of the foreground process group thatuses the process's terminal.@item minfltThe number of minor page faults caused by the process since itsbeginning. (Minor page faults are those that don't involve readingfrom disk.)@item majfltThe number of major page faults caused by the process since itsbeginning. (Major page faults require a disk to be read, and are thusmore expensive than minor page faults.)@item cminflt@itemx cmajfltLike @code{minflt} and @code{majflt}, but include the number of pagefaults for all the child processes of the given process.@item utimeTime spent by the process in the user context, for running theapplication's code. The corresponding @var{value} is in the@w{@code{(@var{high} @var{low} @var{microsec})}} format, the sameformat used by functions @code{current-time} (@pxref{Time of Day,current-time}) and @code{file-attributes} (@pxref{File Attributes}).@item stimeTime spent by the process in the system (kernel) context, forprocessing system calls. The corresponding @var{value} is in the sameformat as for @code{utime}.@item cutime@itemx cstimeLike @code{utime} and @code{stime}, but includes the times of all thechild processes of the given process.@item priThe numerical priority of the process.@item niceThe @dfn{nice value} of the process, a number. (Processes with smallernice values get scheduled more favorably.)@item thcountThe number of threads in the process.@item startThe time the process was started, in the @w{@code{(@var{high}@var{low} @var{microsec})}} format used by @code{current-time} and@code{file-attributes}.@item etimeThe time elapsed since the process started, in the @w{@code{(@var{high}@var{low} @var{microsec})}} format.@item vsizeThe virtual memory size of the process, measured in kilobytes.@item rssThe size of the process's @dfn{resident set}, the number of kilobytesoccupied by the process in the machine's physical memory.@item pcpuThe percentage of the CPU time used by the process since it started.The corresponding @var{value} is a floating-point number between 0 and100.@item pmemThe percentage of the total physical memory installed on the machineused by the process's resident set. The value is a floating-pointnumber between 0 and 100.@item argsThe command-line with which the process was invoked. This is a stringin which individual command-line arguments are separated by blanks;whitespace characters that are embedded in the arguments are quoted asappropriate for the system's shell: escaped by backslash characters onGNU and Unix, and enclosed in double quote characters on Windows.Thus, this command-line string can be directly used in primitives suchas @code{shell-command}.@end table@end defun@node Transaction Queues@section Transaction Queues@cindex transaction queueYou can use a @dfn{transaction queue} to communicate with a subprocessusing transactions. First use @code{tq-create} to create a transactionqueue communicating with a specified process. Then you can call@code{tq-enqueue} to send a transaction.@defun tq-create processThis function creates and returns a transaction queue communicating with@var{process}. The argument @var{process} should be a subprocesscapable of sending and receiving streams of bytes. It may be a childprocess, or it may be a TCP connection to a server, possibly on anothermachine.@end defun@defun tq-enqueue queue question regexp closure fn &optional delay-questionThis function sends a transaction to queue @var{queue}. Specifying thequeue has the effect of specifying the subprocess to talk to.The argument @var{question} is the outgoing message that starts thetransaction. The argument @var{fn} is the function to call when thecorresponding answer comes back; it is called with two arguments:@var{closure}, and the answer received.The argument @var{regexp} is a regular expression that should matchtext at the end of the entire answer, but nothing before; that's how@code{tq-enqueue} determines where the answer ends.If the argument @var{delay-question} is non-nil, delay sending thisquestion until the process has finished replying to any previousquestions. This produces more reliable results with some processes.The return value of @code{tq-enqueue} itself is not meaningful.@end defun@defun tq-close queueShut down transaction queue @var{queue}, waiting for all pending transactionsto complete, and then terminate the connection or child process.@end defunTransaction queues are implemented by means of a filter function.@xref{Filter Functions}.@node Network@section Network Connections@cindex network connection@cindex TCP@cindex UDP Emacs Lisp programs can open stream (TCP) and datagram (UDP) networkconnections to other processes on the same machine or other machines.A network connection is handled by Lisp much like a subprocess, and isrepresented by a process object. However, the process you arecommunicating with is not a child of the Emacs process, so it has noprocess @acronym{ID}, and you can't kill it or send it signals. All youcan do is send and receive data. @code{delete-process} closes theconnection, but does not kill the program at the other end; thatprogram must decide what to do about closure of the connection. Lisp programs can listen for connections by creating networkservers. A network server is also represented by a kind of processobject, but unlike a network connection, the network server nevertransfers data itself. When it receives a connection request, itcreates a new network connection to represent the connection justmade. (The network connection inherits certain information, includingthe process plist, from the server.) The network server then goesback to listening for more connection requests. Network connections and servers are created by calling@code{make-network-process} with an argument list consisting ofkeyword/argument pairs, for example @code{:server t} to create aserver process, or @code{:type 'datagram} to create a datagramconnection. @xref{Low-Level Network}, for details. You can also usethe @code{open-network-stream} function described below. To distinguish the different types of processes, the@code{process-type} function returns the symbol @code{network} for anetwork connection or server, @code{serial} for a serial portconnection, or @code{real} for a real subprocess. The @code{process-status} function returns @code{open},@code{closed}, @code{connect}, and @code{failed} for networkconnections. For a network server, the status is always@code{listen}. None of those values is possible for a realsubprocess. @xref{Process Information}. You can stop and resume operation of a network process by calling@code{stop-process} and @code{continue-process}. For a serverprocess, being stopped means not accepting new connections. (Up to 5connection requests will be queued for when you resume the server; youcan increase this limit, unless it is imposed by the operatingsystem.) For a network stream connection, being stopped means notprocessing input (any arriving input waits until you resume theconnection). For a datagram connection, some number of packets may bequeued but input may be lost. You can use the function@code{process-command} to determine whether a network connection orserver is stopped; a non-@code{nil} value means yes.@defun open-network-stream name buffer-or-name host serviceThis function opens a TCP connection, and returns a process objectthat represents the connection.The @var{name} argument specifies the name for the process object. Itis modified as necessary to make it unique.The @var{buffer-or-name} argument is the buffer to associate with theconnection. Output from the connection is inserted in the buffer,unless you specify a filter function to handle the output. If@var{buffer-or-name} is @code{nil}, it means that the connection is notassociated with any buffer.The arguments @var{host} and @var{service} specify where to connect to;@var{host} is the host name (a string), and @var{service} is the name ofa defined network service (a string) or a port number (an integer).@end defun@node Network Servers@section Network Servers@cindex network servers You create a server by calling @code{make-network-process} with@code{:server t}. The server will listen for connection requests fromclients. When it accepts a client connection request, that creates anew network connection, itself a process object, with the followingparameters:@itemize @bullet@itemThe connection's process name is constructed by concatenating theserver process' @var{name} with a client identification string. Theclient identification string for an IPv4 connection looks like@samp{<@var{a}.@var{b}.@var{c}.@var{d}:@var{p}>}. Otherwise, it is aunique number in brackets, as in @samp{<@var{nnn}>}. The numberis unique for each connection in the Emacs session.@itemIf the server's filter is non-@code{nil}, the connection process doesnot get a separate process buffer; otherwise, Emacs creates a newbuffer for the purpose. The buffer name is the server's buffer nameor process name, concatenated with the client identification string.The server's process buffer value is never used directly by Emacs, butit is passed to the log function, which can log connections byinserting text there.@itemThe communication type and the process filter and sentinel areinherited from those of the server. The server never directlyuses its filter and sentinel; their sole purpose is to initializeconnections made to the server.@itemThe connection's process contact info is set according to the client'saddressing information (typically an IP address and a port number).This information is associated with the @code{process-contact}keywords @code{:host}, @code{:service}, @code{:remote}.@itemThe connection's local address is set up according to the portnumber used for the connection.@itemThe client process' plist is initialized from the server's plist.@end itemize@node Datagrams@section Datagrams@cindex datagrams A datagram connection communicates with individual packets ratherthan streams of data. Each call to @code{process-send} sends onedatagram packet (@pxref{Input to Processes}), and each datagramreceived results in one call to the filter function. The datagram connection doesn't have to talk with the same remotepeer all the time. It has a @dfn{remote peer address} which specifieswhere to send datagrams to. Each time an incoming datagram is passedto the filter function, the peer address is set to the address thatdatagram came from; that way, if the filter function sends a datagram,it will go back to that place. You can specify the remote peeraddress when you create the datagram connection using the@code{:remote} keyword. You can change it later on by calling@code{set-process-datagram-address}.@defun process-datagram-address processIf @var{process} is a datagram connection or server, this functionreturns its remote peer address.@end defun@defun set-process-datagram-address process addressIf @var{process} is a datagram connection or server, this functionsets its remote peer address to @var{address}.@end defun@node Low-Level Network@section Low-Level Network Access You can also create network connections by operating at a lowerlevel than that of @code{open-network-stream}, using@code{make-network-process}.@menu* Proc: Network Processes. Using @code{make-network-process}.* Options: Network Options. Further control over network connections.* Features: Network Feature Testing. Determining which network features work on the machine you are using.@end menu@node Network Processes@subsection @code{make-network-process} The basic function for creating network connections and networkservers is @code{make-network-process}. It can do either of thosejobs, depending on the arguments you give it.@defun make-network-process &rest argsThis function creates a network connection or server and returns theprocess object that represents it. The arguments @var{args} are alist of keyword/argument pairs. Omitting a keyword is alwaysequivalent to specifying it with value @code{nil}, except for@code{:coding}, @code{:filter-multibyte}, and @code{:reuseaddr}. Hereare the meaningful keywords:@table @asis@item :name @var{name}Use the string @var{name} as the process name. It is modified ifnecessary to make it unique.@item :type @var{type}Specify the communication type. A value of @code{nil} specifies astream connection (the default); @code{datagram} specifies a datagramconnection. Both connections and servers can be of either type.@item :server @var{server-flag}If @var{server-flag} is non-@code{nil}, create a server. Otherwise,create a connection. For a stream type server, @var{server-flag} maybe an integer which then specifies the length of the queue of pendingconnections to the server. The default queue length is 5.@item :host @var{host}Specify the host to connect to. @var{host} should be a host name orInternet address, as a string, or the symbol @code{local} to specifythe local host. If you specify @var{host} for a server, it mustspecify a valid address for the local host, and only clientsconnecting to that address will be accepted.@item :service @var{service}@var{service} specifies a port number to connect to, or, for a server,the port number to listen on. It should be a service name thattranslates to a port number, or an integer specifying the port numberdirectly. For a server, it can also be @code{t}, which means to letthe system select an unused port number.@item :family @var{family}@var{family} specifies the address (and protocol) family forcommunication. @code{nil} means determine the proper address familyautomatically for the given @var{host} and @var{service}.@code{local} specifies a Unix socket, in which case @var{host} isignored. @code{ipv4} and @code{ipv6} specify to use IPv4 and IPv6respectively.@item :local @var{local-address}For a server process, @var{local-address} is the address to listen on.It overrides @var{family}, @var{host} and @var{service}, and youmay as well not specify them.@item :remote @var{remote-address}For a connection, @var{remote-address} is the address to connect to.It overrides @var{family}, @var{host} and @var{service}, and youmay as well not specify them.For a datagram server, @var{remote-address} specifies the initialsetting of the remote datagram address.The format of @var{local-address} or @var{remote-address} depends onthe address family:@itemize -@itemAn IPv4 address is represented as a five-element vector of four 8-bitintegers and one 16-bit integer@code{[@var{a} @var{b} @var{c} @var{d} @var{p}]} corresponding tonumeric IPv4 address @var{a}.@var{b}.@var{c}.@var{d} and port number@var{p}.@itemAn IPv6 address is represented as a nine-element vector of 16-bitintegers @code{[@var{a} @var{b} @var{c} @var{d} @var{e} @var{f}@var{g} @var{h} @var{p}]} corresponding to numeric IPv6 address@var{a}:@var{b}:@var{c}:@var{d}:@var{e}:@var{f}:@var{g}:@var{h} andport number @var{p}.@itemA local address is represented as a string which specifies the addressin the local address space.@itemAn ``unsupported family'' address is represented by a cons@code{(@var{f} . @var{av})}, where @var{f} is the family number and@var{av} is a vector specifying the socket address using one elementper address data byte. Do not rely on this format in portable code,as it may depend on implementation defined constants, data sizes, anddata structure alignment.@end itemize@item :nowait @var{bool}If @var{bool} is non-@code{nil} for a stream connection, returnwithout waiting for the connection to complete. When the connectionsucceeds or fails, Emacs will call the sentinel function, with asecond argument matching @code{"open"} (if successful) or@code{"failed"}. The default is to block, so that@code{make-network-process} does not return until the connectionhas succeeded or failed.@item :stop @var{stopped}Start the network connection or server in the `stopped' state if@var{stopped} is non-@code{nil}.@item :buffer @var{buffer}Use @var{buffer} as the process buffer.@item :coding @var{coding}Use @var{coding} as the coding system for this process. To specifydifferent coding systems for decoding data from the connection and forencoding data sent to it, specify @code{(@var{decoding} .@var{encoding})} for @var{coding}.If you don't specify this keyword at all, the defaultis to determine the coding systems from the data.@item :noquery @var{query-flag}Initialize the process query flag to @var{query-flag}.@xref{Query Before Exit}.@item :filter @var{filter}Initialize the process filter to @var{filter}.@item :filter-multibyte @var{bool}If @var{bool} is non-@code{nil}, strings given to the process filterare multibyte, otherwise they are unibyte. If you don't specify thiskeyword at all, the default is that the strings are multibyte if@code{default-enable-multibyte-characters} is non-@code{nil}.@item :sentinel @var{sentinel}Initialize the process sentinel to @var{sentinel}.@item :log @var{log}Initialize the log function of a server process to @var{log}. The logfunction is called each time the server accepts a network connectionfrom a client. The arguments passed to the log function are@var{server}, @var{connection}, and @var{message}, where @var{server}is the server process, @var{connection} is the new process for theconnection, and @var{message} is a string describing what hashappened.@item :plist @var{plist}Initialize the process plist to @var{plist}.@end tableThe original argument list, modified with the actual connectioninformation, is available via the @code{process-contact} function.@end defun@node Network Options@subsection Network Options The following network options can be specified when you create anetwork process. Except for @code{:reuseaddr}, you can also set ormodify these options later, using @code{set-network-process-option}. For a server process, the options specified with@code{make-network-process} are not inherited by the clientconnections, so you will need to set the necessary options for eachchild connection as it is created.@table @asis@item :bindtodevice @var{device-name}If @var{device-name} is a non-empty string identifying a networkinterface name (see @code{network-interface-list}), only handlepackets received on that interface. If @var{device-name} is @code{nil}(the default), handle packets received on any interface.Using this option may require special privileges on some systems.@item :broadcast @var{broadcast-flag}If @var{broadcast-flag} is non-@code{nil} for a datagram process, theprocess will receive datagram packet sent to a broadcast address, andbe able to send packets to a broadcast address. Ignored for a streamconnection.@item :dontroute @var{dontroute-flag}If @var{dontroute-flag} is non-@code{nil}, the process can only sendto hosts on the same network as the local host.@item :keepalive @var{keepalive-flag}If @var{keepalive-flag} is non-@code{nil} for a stream connection,enable exchange of low-level keep-alive messages.@item :linger @var{linger-arg}If @var{linger-arg} is non-@code{nil}, wait for successfultransmission of all queued packets on the connection before it isdeleted (see @code{delete-process}). If @var{linger-arg} is aninteger, it specifies the maximum time in seconds to wait for queuedpackets to be sent before closing the connection. Default is@code{nil} which means to discard unsent queued packets when theprocess is deleted.@item :oobinline @var{oobinline-flag}If @var{oobinline-flag} is non-@code{nil} for a stream connection,receive out-of-band data in the normal data stream. Otherwise, ignoreout-of-band data.@item :priority @var{priority}Set the priority for packets sent on this connection to the integer@var{priority}. The interpretation of this number is protocolspecific, such as setting the TOS (type of service) field on IPpackets sent on this connection. It may also have system dependenteffects, such as selecting a specific output queue on the networkinterface.@item :reuseaddr @var{reuseaddr-flag}If @var{reuseaddr-flag} is non-@code{nil} (the default) for a streamserver process, allow this server to reuse a specific port number (see@code{:service}) unless another process on this host is alreadylistening on that port. If @var{reuseaddr-flag} is @code{nil}, theremay be a period of time after the last use of that port (by anyprocess on the host), where it is not possible to make a new server onthat port.@end table@defun set-network-process-option process option valueThis function sets or modifies a network option for network process@var{process}. See @code{make-network-process} for details of options@var{option} and their corresponding values @var{value}.The current setting of an option is available via the@code{process-contact} function.@end defun@node Network Feature Testing@subsection Testing Availability of Network Features To test for the availability of a given network feature, use@code{featurep} like this:@example(featurep 'make-network-process '(@var{keyword} @var{value}))@end example@noindentThe result of the first form is @code{t} if it works to specify@var{keyword} with value @var{value} in @code{make-network-process}.The result of the second form is @code{t} if @var{keyword} issupported by @code{make-network-process}. Here are some of the@var{keyword}---@var{value} pairs you can test inthis way.@table @code@item (:nowait t)Non-@code{nil} if non-blocking connect is supported.@item (:type datagram)Non-@code{nil} if datagrams are supported.@item (:family local)Non-@code{nil} if local (a.k.a.@: ``UNIX domain'') sockets are supported.@item (:family ipv6)Non-@code{nil} if IPv6 is supported.@item (:service t)Non-@code{nil} if the system can select the port for a server.@end table To test for the availability of a given network option, use@code{featurep} like this:@example(featurep 'make-network-process '@var{keyword})@end example@noindentHere are some of the options you can test in this way.@table @code@item :bindtodevice@itemx :broadcast@itemx :dontroute@itemx :keepalive@itemx :linger@itemx :oobinline@itemx :priority@itemx :reuseaddrThat particular network option is supported by@code{make-network-process} and @code{set-network-process-option}.@end table@node Misc Network@section Misc Network Facilities These additional functions are useful for creating and operatingon network connections. Note that they are supported only on somesystems.@defun network-interface-listThis function returns a list describing the network interfacesof the machine you are using. The value is an alist whoseelements have the form @code{(@var{name} . @var{address})}.@var{address} has the same form as the @var{local-address}and @var{remote-address} arguments to @code{make-network-process}.@end defun@defun network-interface-info ifnameThis function returns information about the network interface named@var{ifname}. The value is a list of the form@code{(@var{addr} @var{bcast} @var{netmask} @var{hwaddr} @var{flags})}.@table @var@item addrThe Internet protocol address.@item bcastThe broadcast address.@item netmaskThe network mask.@item hwaddrThe layer 2 address (Ethernet MAC address, for instance).@item flagsThe current flags of the interface.@end table@end defun@defun format-network-address address &optional omit-portThis function converts the Lisp representation of a network address toa string.A five-element vector @code{[@var{a} @var{b} @var{c} @var{d} @var{p}]}represents an IPv4 address @var{a}.@var{b}.@var{c}.@var{d} and portnumber @var{p}. @code{format-network-address} converts that to thestring @code{"@var{a}.@var{b}.@var{c}.@var{d}:@var{p}"}.A nine-element vector @code{[@var{a} @var{b} @var{c} @var{d} @var{e}@var{f} @var{g} @var{h} @var{p}]} represents an IPv6 address alongwith a port number. @code{format-network-address} converts that tothe string@code{"[@var{a}:@var{b}:@var{c}:@var{d}:@var{e}:@var{f}:@var{g}:@var{h}]:@var{p}"}.If the vector does not include the port number, @var{p}, or if@var{omit-port} is non-@code{nil}, the result does not include the@code{:@var{p}} suffix.@end defun@node Serial Ports@section Communicating with Serial Ports@cindex @file{/dev/tty}@cindex @file{COM1}@cindex serial connections Emacs can communicate with serial ports. For interactive use,@kbd{M-x serial-term} opens a terminal window. In a Lisp program,@code{make-serial-process} creates a process object. The serial port can be configured at run-time, without having toclose and re-open it. The function @code{serial-process-configure}lets you change the speed, bytesize, and other parameters. In aterminal window created by @code{serial-term}, you can click on themode line for configuration. A serial connection is represented by a process object which can beused similar to a subprocess or network process. You can send andreceive data and configure the serial port. A serial process objecthas no process ID, you can't send signals to it, and the status codesare different from other types of processes.@code{delete-process} on the process object or @code{kill-buffer} onthe process buffer close the connection, but this does not affect thedevice connected to the serial port. The function @code{process-type} returns the symbol @code{serial}for a process object representing a serial port connection. Serial ports are available on GNU/Linux, Unix, and Windows systems.@deffn Command serial-term port speedStart a terminal-emulator for a serial port in a new buffer.@var{port} is the name of the serial port to which to connect. Forexample, this could be @file{/dev/ttyS0} on Unix. On Windows, thiscould be @file{COM1}, or @file{\\.\COM10} (double the backslashes inLisp strings).@var{speed} is the speed of the serial port in bits per second. 9600is a common value. The buffer is in Term mode; see @ref{Term Mode,,,emacs, The GNU Emacs Manual}, for the commands to use in that buffer.You can change the speed and the configuration in the mode line menu.@end deffn@defun make-serial-process &rest argsThis function creates a process and a buffer. Arguments are specifiedas keyword/argument pairs. Here's the list of the meaningful keywords:@table @code@item :port @var{port}@r{ (mandatory)}This is the name of the serial port. On Unix and GNU systems, this isa file name such as @file{/dev/ttyS0}. On Windows, this could be@file{COM1}, or @file{\\.\COM10} for ports higher than @file{COM9}(double the backslashes in Lisp strings).@item :speed @var{speed}@r{ (mandatory)}The speed of the serial port in bits per second. This function calls@code{serial-process-configure} to handle the speed.@item :name @var{name}The name of the process. If @var{name} is not given, @var{port} willserve as the process name as well.@item :buffer @var{buffer}The buffer to associate with the process. The value could be either abuffer or a string that names a buffer. Process output goes at theend of that buffer, unless you specify an output stream or filterfunction to handle the output. If @var{buffer} is not given, theprocess buffer's name is taken from the value of the @code{:name}keyword.@item :coding @var{coding}If @var{coding} is a symbol, it specifies the coding system used forboth reading and writing for this process. If @var{coding} is a cons@code{(decoding . encoding)}, @var{decoding} is used for reading, and@var{encoding} is used for writing. If not specified, the default isto determine the coding systems from data itself.@item :noquery @var{query-flag}Initialize the process query flag to @var{query-flag}. @xref{QueryBefore Exit}. The flags defaults to @code{nil} if unspecified.@item :stop @var{bool}Start process in the @code{stopped} state if @var{bool} isnon-@code{nil}. In the stopped state, a serial process does notaccept incoming data, but you can send outgoing data. The stoppedstate is cleared by @code{continue-process} and set by@code{stop-process}.@item :filter @var{filter}Install @var{filter} as the process filter.@item :sentinel @var{sentinel}Install @var{sentinel} as the process sentinel.@item :plist @var{plist}Install @var{plist} as the initial plist of the process.@item :speed@itemx :bytesize@itemx :parity@itemx :stopbits@itemx :flowcontrolThese arguments are handled by @code{serial-process-configure}, whichis called by @code{make-serial-process}.@end tableThe original argument list, possibly modified by later configuration,is available via the function @code{process-contact}.Examples:@example(make-serial-process :port "/dev/ttyS0" :speed 9600)(make-serial-process :port "COM1" :speed 115200 :stopbits 2)(make-serial-process :port "\\\\.\\COM13" :speed 1200 :bytesize 7 :parity 'odd)(make-serial-process :port "/dev/tty.BlueConsole-SPP-1" :speed nil)@end example@end defun@defun serial-process-configure &rest args@cindex baud, in serial connections@cindex bytesize, in serial connections@cindex parity, in serial connections@cindex stopbits, in serial connections@cindex flowcontrol, in serial connectionsThis functions configures a serial port connection. Arguments arespecified as keyword/argument pairs. Attributes that are not givenare re-initialized from the process's current configuration (availablevia the function @code{process-contact}) or set to reasonable defaultvalues. The following arguments are defined:@table @code@item :process @var{process}@itemx :name @var{name}@itemx :buffer @var{buffer}@itemx :port @var{port}Any of these arguments can be given to identify the process that is tobe configured. If none of these arguments is given, the currentbuffer's process is used.@item :speed @var{speed}The speed of the serial port in bits per second, a.k.a.@: @dfn{baudrate}. The value can be any number, but most serial ports work onlyat a few defined values between 1200 and 115200, with 9600 being themost common value. If @var{speed} is @code{nil}, the function ignoresall other arguments and does not configure the port. This may beuseful for special serial ports such as Bluetooth-to-serial converterswhich can only be configured through AT commands sent through theconnection. You can use the value of @code{nil} for @var{speed} onlyfor connections that are already open by a previous call to@code{make-serial-process} or @code{serial-term}.@item :bytesize @var{bytesize}The number of bits per byte, which can be 7 or 8. If @var{bytesize}is not given or @code{nil}, it defaults to 8.@item :parity @var{parity}The value can be @code{nil} (don't use parity), the symbol@code{odd} (use odd parity), or the symbol @code{even} (use evenparity). If @var{parity} is not given, it defaults to no parity.@item :stopbits @var{stopbits}The number of stopbits used to terminate a transmissionof each byte. @var{stopbits} can be 1 or 2. If @var{stopbits} is notgiven or @code{nil}, it defaults to 1.@item :flowcontrol @var{flowcontrol}The type of flow control to use for this connection, which is either@code{nil} (don't use flow control), the symbol @code{hw} (use RTS/CTShardware flow control), or the symbol @code{sw} (use XON/XOFF softwareflow control). If @var{flowcontrol} is not given, it defaults to noflow control.@end table@code{serial-process-configure} is called by @code{make-serial-process} for theinitial configuration of the serial port.Examples:@example(serial-process-configure :process "/dev/ttyS0" :speed 1200)(serial-process-configure :buffer "COM1" :stopbits 1 :parity 'odd :flowcontrol 'hw)(serial-process-configure :port "\\\\.\\COM13" :bytesize 7)@end example@end defun@node Byte Packing@section Packing and Unpacking Byte Arrays@cindex byte packing and unpacking This section describes how to pack and unpack arrays of bytes,usually for binary network protocols. These functions convert byte arraysto alists, and vice versa. The byte array can be represented as aunibyte string or as a vector of integers, while the alist associatessymbols either with fixed-size objects or with recursive sub-alists.@cindex serializing@cindex deserializing@cindex packing@cindex unpacking Conversion from byte arrays to nested alists is also known as@dfn{deserializing} or @dfn{unpacking}, while going in the oppositedirection is also known as @dfn{serializing} or @dfn{packing}.@menu* Bindat Spec:: Describing data layout.* Bindat Functions:: Doing the unpacking and packing.* Bindat Examples:: Samples of what bindat.el can do for you!@end menu@node Bindat Spec@subsection Describing Data Layout To control unpacking and packing, you write a @dfn{data layoutspecification}, a special nested list describing named and typed@dfn{fields}. This specification controls length of each field to beprocessed, and how to pack or unpack it. We normally keep bindat specsin variables whose names end in @samp{-bindat-spec}; that kind of nameis automatically recognized as ``risky.''@cindex endianness@cindex big endian@cindex little endian@cindex network byte ordering A field's @dfn{type} describes the size (in bytes) of the objectthat the field represents and, in the case of multibyte fields, howthe bytes are ordered within the field. The two possible orderingsare ``big endian'' (also known as ``network byte ordering'') and``little endian.'' For instance, the number @code{#x23cd} (decimal9165) in big endian would be the two bytes @code{#x23} @code{#xcd};and in little endian, @code{#xcd} @code{#x23}. Here are the possibletype values:@table @code@item u8@itemx byteUnsigned byte, with length 1.@item u16@itemx word@itemx shortUnsigned integer in network byte order, with length 2.@item u24Unsigned integer in network byte order, with length 3.@item u32@itemx dword@itemx longUnsigned integer in network byte order, with length 4.Note: These values may be limited by Emacs' integer implementation limits.@item u16r@itemx u24r@itemx u32rUnsigned integer in little endian order, with length 2, 3 and 4, respectively.@item str @var{len}String of length @var{len}.@item strz @var{len}Zero-terminated string, in a fixed-size field with length @var{len}.@item vec @var{len} [@var{type}]Vector of @var{len} elements of type @var{type}, or bytes if not@var{type} is specified.The @var{type} is any of the simple types above, or another vectorspecified as a list @code{(vec @var{len} [@var{type}])}.@item ipFour-byte vector representing an Internet address. For example:@code{[127 0 0 1]} for localhost.@item bits @var{len}List of set bits in @var{len} bytes. The bytes are taken in bigendian order and the bits are numbered starting with @code{8 *@var{len} @minus{} 1} and ending with zero. For example: @code{bits2} unpacks @code{#x28} @code{#x1c} to @code{(2 3 4 11 13)} and@code{#x1c} @code{#x28} to @code{(3 5 10 11 12)}.@item (eval @var{form})@var{form} is a Lisp expression evaluated at the moment the field isunpacked or packed. The result of the evaluation should be one of theabove-listed type specifications.@end tableFor a fixed-size field, the length @var{len} is given as an integerspecifying the number of bytes in the field.When the length of a field is not fixed, it typically depends on thevalue of a preceding field. In this case, the length @var{len} can begiven either as a list @code{(@var{name} ...)} identifying a@dfn{field name} in the format specified for @code{bindat-get-field}below, or by an expression @code{(eval @var{form})} where @var{form}should evaluate to an integer, specifying the field length.A field specification generally has the form @code{([@var{name}]@var{handler})}. The square braces indicate that @var{name} isoptional. (Don't use names that are symbols meaningful as typespecifications (above) or handler specifications (below), since thatwould be ambiguous.) @var{name} can be a symbol or the expression@code{(eval @var{form})}, in which case @var{form} should evaluate toa symbol.@var{handler} describes how to unpack or pack the field and can be oneof the following:@table @code@item @var{type}Unpack/pack this field according to the type specification @var{type}.@item eval @var{form}Evaluate @var{form}, a Lisp expression, for side-effect only. If thefield name is specified, the value is bound to that field name.@item fill @var{len}Skip @var{len} bytes. In packing, this leaves them unchanged,which normally means they remain zero. In unpacking, this meansthey are ignored.@item align @var{len}Skip to the next multiple of @var{len} bytes.@item struct @var{spec-name}Process @var{spec-name} as a sub-specification. This describes astructure nested within another structure.@item union @var{form} (@var{tag} @var{spec})@dots{}@c ??? I don't see how one would actually use this.@c ??? what kind of expression would be useful for @var{form}?Evaluate @var{form}, a Lisp expression, find the first @var{tag}that matches it, and process its associated data layout specification@var{spec}. Matching can occur in one of three ways:@itemize@itemIf a @var{tag} has the form @code{(eval @var{expr})}, evaluate@var{expr} with the variable @code{tag} dynamically bound to the valueof @var{form}. A non-@code{nil} result indicates a match.@item@var{tag} matches if it is @code{equal} to the value of @var{form}.@item@var{tag} matches unconditionally if it is @code{t}.@end itemize@item repeat @var{count} @var{field-specs}@dots{}Process the @var{field-specs} recursively, in order, then repeatstarting from the first one, processing all the specs @var{count}times overall. The @var{count} is given using the same formats as afield length---if an @code{eval} form is used, it is evaluated just once.For correct operation, each spec in @var{field-specs} must include a name.@end tableFor the @code{(eval @var{form})} forms used in a bindat specification,the @var{form} can access and update these dynamically bound variablesduring evaluation:@table @code@item lastValue of the last field processed.@item bindat-rawThe data as a byte array.@item bindat-idxCurrent index (within @code{bindat-raw}) for unpacking or packing.@item structThe alist containing the structured data that have been unpacked sofar, or the entire structure being packed. You can use@code{bindat-get-field} to access specific fields of this structure.@item count@itemx indexInside a @code{repeat} block, these contain the maximum number ofrepetitions (as specified by the @var{count} parameter), and thecurrent repetition number (counting from 0). Setting @code{count} tozero will terminate the inner-most repeat block after the currentrepetition has completed.@end table@node Bindat Functions@subsection Functions to Unpack and Pack Bytes In the following documentation, @var{spec} refers to a data layoutspecification, @code{bindat-raw} to a byte array, and @var{struct} to analist representing unpacked field data.@defun bindat-unpack spec bindat-raw &optional bindat-idxThis function unpacks data from the unibyte string or bytearray @code{bindat-raw}according to @var{spec}. Normally this starts unpacking at thebeginning of the byte array, but if @var{bindat-idx} is non-@code{nil}, itspecifies a zero-based starting position to use instead.The value is an alist or nested alist in which each element describesone unpacked field.@end defun@defun bindat-get-field struct &rest nameThis function selects a field's data from the nested alist@var{struct}. Usually @var{struct} was returned by@code{bindat-unpack}. If @var{name} corresponds to just one argument,that means to extract a top-level field value. Multiple @var{name}arguments specify repeated lookup of sub-structures. An integer nameacts as an array index.For example, if @var{name} is @code{(a b 2 c)}, that means to findfield @code{c} in the third element of subfield @code{b} of field@code{a}. (This corresponds to @code{struct.a.b[2].c} in C.)@end defun Although packing and unpacking operations change the organization ofdata (in memory), they preserve the data's @dfn{total length}, which isthe sum of all the fields' lengths, in bytes. This value is notgenerally inherent in either the specification or alist alone; instead,both pieces of information contribute to its calculation. Likewise, thelength of a string or array being unpacked may be longer than the data'stotal length as described by the specification.@defun bindat-length spec structThis function returns the total length of the data in @var{struct},according to @var{spec}.@end defun@defun bindat-pack spec struct &optional bindat-raw bindat-idxThis function returns a byte array packed according to @var{spec} fromthe data in the alist @var{struct}. Normally it creates and fills anew byte array starting at the beginning. However, if @var{bindat-raw}is non-@code{nil}, it specifies a pre-allocated unibyte string or vector topack into. If @var{bindat-idx} is non-@code{nil}, it specifies the startingoffset for packing into @code{bindat-raw}.When pre-allocating, you should make sure @code{(length @var{bindat-raw})}meets or exceeds the total length to avoid an out-of-range error.@end defun@defun bindat-ip-to-string ipConvert the Internet address vector @var{ip} to a string in the usualdotted notation.@example(bindat-ip-to-string [127 0 0 1]) @result{} "127.0.0.1"@end example@end defun@node Bindat Examples@subsection Examples of Byte Unpacking and Packing Here is a complete example of byte unpacking and packing:@lisp(defvar fcookie-index-spec '((:version u32) (:count u32) (:longest u32) (:shortest u32) (:flags u32) (:delim u8) (:ignored fill 3) (:offset repeat (:count) (:foo u32))) "Description of a fortune cookie index file's contents.")(defun fcookie (cookies &optional index) "Display a random fortune cookie from file COOKIES.Optional second arg INDEX specifies the associated indexfilename, which is by default constructed by appending\".dat\" to COOKIES. Display cookie text in possiblynew buffer \"*Fortune Cookie: BASENAME*\" where BASENAMEis COOKIES without the directory part." (interactive "fCookies file: ") (let* ((info (with-temp-buffer (insert-file-contents-literally (or index (concat cookies ".dat"))) (bindat-unpack fcookie-index-spec (buffer-string)))) (sel (random (bindat-get-field info :count))) (beg (cdar (bindat-get-field info :offset sel))) (end (or (cdar (bindat-get-field info :offset (1+ sel))) (nth 7 (file-attributes cookies))))) (switch-to-buffer (get-buffer-create (format "*Fortune Cookie: %s*" (file-name-nondirectory cookies)))) (erase-buffer) (insert-file-contents-literally cookies nil beg (- end 3))))(defun fcookie-create-index (cookies &optional index delim) "Scan file COOKIES, and write out its index file.Optional second arg INDEX specifies the index filename,which is by default constructed by appending \".dat\" toCOOKIES. Optional third arg DELIM specifies the unibytecharacter which, when found on a line of its own inCOOKIES, indicates the border between entries." (interactive "fCookies file: ") (setq delim (or delim ?%)) (let ((delim-line (format "\n%c\n" delim)) (count 0) (max 0) min p q len offsets) (unless (= 3 (string-bytes delim-line)) (error "Delimiter cannot be represented in one byte")) (with-temp-buffer (insert-file-contents-literally cookies) (while (and (setq p (point)) (search-forward delim-line (point-max) t) (setq len (- (point) 3 p))) (setq count (1+ count) max (max max len) min (min (or min max) len) offsets (cons (1- p) offsets)))) (with-temp-buffer (set-buffer-multibyte nil) (insert (bindat-pack fcookie-index-spec `((:version . 2) (:count . ,count) (:longest . ,max) (:shortest . ,min) (:flags . 0) (:delim . ,delim) (:offset . ,(mapcar (lambda (o) (list (cons :foo o))) (nreverse offsets)))))) (let ((coding-system-for-write 'raw-text-unix)) (write-file (or index (concat cookies ".dat")))))))@end lispFollowing is an example of defining and unpacking a complex structure.Consider the following C structures:@examplestruct header @{ unsigned long dest_ip; unsigned long src_ip; unsigned short dest_port; unsigned short src_port;@};struct data @{ unsigned char type; unsigned char opcode; unsigned short length; /* In network byte order */ unsigned char id[8]; /* null-terminated string */ unsigned char data[/* (length + 3) & ~3 */];@};struct packet @{ struct header header; unsigned long counters[2]; /* In little endian order */ unsigned char items; unsigned char filler[3]; struct data item[/* items */];@};@end exampleThe corresponding data layout specification:@lisp(setq header-spec '((dest-ip ip) (src-ip ip) (dest-port u16) (src-port u16)))(setq data-spec '((type u8) (opcode u8) (length u16) ;; network byte order (id strz 8) (data vec (length)) (align 4)))(setq packet-spec '((header struct header-spec) (counters vec 2 u32r) ;; little endian order (items u8) (fill 3) (item repeat (items) (struct data-spec))))@end lispA binary data representation:@lisp(setq binary-data [ 192 168 1 100 192 168 1 101 01 28 21 32 160 134 1 0 5 1 0 0 2 0 0 0 2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0 1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ])@end lispThe corresponding decoded structure:@lisp(setq decoded (bindat-unpack packet-spec binary-data)) @result{}((header (dest-ip . [192 168 1 100]) (src-ip . [192 168 1 101]) (dest-port . 284) (src-port . 5408)) (counters . [100000 261]) (items . 2) (item ((data . [1 2 3 4 5]) (id . "ABCDEF") (length . 5) (opcode . 3) (type . 2)) ((data . [6 7 8 9 10 11 12]) (id . "BCDEFG") (length . 7) (opcode . 4) (type . 1))))@end lispFetching data from this structure:@lisp(bindat-get-field decoded 'item 1 'id) @result{} "BCDEFG"@end lisp@ignore arch-tag: ba9da253-e65f-4e7f-b727-08fba0a1df7a@end ignore