annotate man/lispref/processes.texi @ 5089:99f8ebc082d9

Make #'substring an alias of #'subseq; give the latter the byte code. src/ChangeLog addition: 2010-03-03 Aidan Kehoe <kehoea@parhasard.net> * fns.c (Fsubstring): Removed. * search.c (Freplace_match): * minibuf.c (Ftry_completion): * lisp.h: * keymap.c (ensure_meta_prefix_char_keymapp): * dired.c (user_name_completion, file_name_completion): * console-x.c (x_canonicalize_console_connection): * bytecode.c (Bsubseq): * bytecode-ops.h (subseq): Move #'substring to Lisp, as an alias for #'subseq; change all C Fsubstring() calls to Fsubseq(), change the Bsubstring bytecode to Bsubseq. Motivation; not accepting vectors in #'substring is incompatible with GNU, and Common Lisp prefers #'subseq, it has no #'substring. lisp/ChangeLog addition: 2010-03-03 Aidan Kehoe <kehoea@parhasard.net> Move byte code #o117 to #'subseq, not #'substring. Make #'substring available as an alias for #'subseq in Lisp. * bytecomp.el (79, subseq, substring): * bytecomp.el (byte-compile-subseq): New. * update-elc.el (update-elc-chop-extension): Use #'subseq, not #'substring, the latter is not yet available. * subr.el (substring): New alias, to #'subseq. man/ChangeLog addition: 2010-03-03 Aidan Kehoe <kehoea@parhasard.net> * lispref/tips.texi (Comment Tips): * lispref/text.texi (Text Properties): * lispref/strings.texi (Creating Strings): * lispref/processes.texi (Input to Processes): * lispref/functions.texi (Argument List): * lispref/extents.texi (Duplicable Extents): Move examples that used substring to using subseq; in strings.texi, do not change the examples, but document that in this XEmacs, it is an alias for subseq, and that there may be some incompatibilities if you depend on that.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 03 Mar 2010 18:40:12 +0000
parents 6772ce4d982b
children 965a9ddc915a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 @setfilename ../../info/processes.info
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 @node Processes, System Interface, Databases, Top
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 @chapter Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 @cindex child process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 @cindex parent process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 @cindex subprocess
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 @cindex process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 In the terminology of operating systems, a @dfn{process} is a space in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 which a program can execute. XEmacs runs in a process. XEmacs Lisp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 programs can invoke other programs in processes of their own. These are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 called @dfn{subprocesses} or @dfn{child processes} of the XEmacs process,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 which is their @dfn{parent process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 A subprocess of XEmacs may be @dfn{synchronous} or @dfn{asynchronous},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 depending on how it is created. When you create a synchronous
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 subprocess, the Lisp program waits for the subprocess to terminate
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 before continuing execution. When you create an asynchronous
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 subprocess, it can run in parallel with the Lisp program. This kind of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 subprocess is represented within XEmacs by a Lisp object which is also
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 called a ``process''. Lisp programs can use this object to communicate
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 with the subprocess or to control it. For example, you can send
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 signals, obtain status information, receive output from the process, or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 send input to it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 @defun processp object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 This function returns @code{t} if @var{object} is a process,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 @code{nil} otherwise.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 @menu
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 * Subprocess Creation:: Functions that start subprocesses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 * Synchronous Processes:: Details of using synchronous subprocesses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 * MS-DOS Subprocesses:: On MS-DOS, you must indicate text vs binary
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 for data sent to and from a subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 * Asynchronous Processes:: Starting up an asynchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 * Deleting Processes:: Eliminating an asynchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 * Process Information:: Accessing run-status and other attributes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 * Input to Processes:: Sending input to an asynchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 * Signals to Processes:: Stopping, continuing or interrupting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 an asynchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 * Output from Processes:: Collecting output from an asynchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 * Sentinels:: Sentinels run when process run-status changes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 * Process Window Size:: Changing the logical window size of a process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 * Transaction Queues:: Transaction-based communication with subprocesses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 * Network:: Opening network connections.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 @end menu
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 @node Subprocess Creation
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 @section Functions that Create Subprocesses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 There are three functions that create a new subprocess in which to run
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 a program. One of them, @code{start-process}, creates an asynchronous
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 process and returns a process object (@pxref{Asynchronous Processes}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 The other two, @code{call-process} and @code{call-process-region},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 create a synchronous process and do not return a process object
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (@pxref{Synchronous Processes}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
63 Synchronous and asynchronous processes are explained in the following
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 sections. Since the three functions are all called in a similar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 fashion, their common arguments are described here.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 @cindex execute program
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 @cindex @code{PATH} environment variable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 @cindex @code{HOME} environment variable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 In all cases, the function's @var{program} argument specifies the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 program to be run. An error is signaled if the file is not found or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 cannot be executed. If the file name is relative, the variable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 @code{exec-path} contains a list of directories to search. Emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 initializes @code{exec-path} when it starts up, based on the value of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 the environment variable @code{PATH}. The standard file name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 constructs, @samp{~}, @samp{.}, and @samp{..}, are interpreted as usual
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 in @code{exec-path}, but environment variable substitutions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (@samp{$HOME}, etc.) are not recognized; use
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 @code{substitute-in-file-name} to perform them (@pxref{File Name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 Expansion}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 Each of the subprocess-creating functions has a @var{buffer-or-name}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 argument which specifies where the standard output from the program will
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 go. If @var{buffer-or-name} is @code{nil}, that says to discard the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 output unless a filter function handles it. (@xref{Filter Functions},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 and @ref{Read and Print}.) Normally, you should avoid having multiple
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 processes send output to the same buffer because their output would be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 intermixed randomly.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 @cindex program arguments
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 All three of the subprocess-creating functions have a @code{&rest}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 argument, @var{args}. The @var{args} must all be strings, and they are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 supplied to @var{program} as separate command line arguments. Wildcard
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 characters and other shell constructs are not allowed in these strings,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
95 since they are passed directly to the specified program.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 @strong{Please note:} The argument @var{program} contains only the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 name of the program; it may not contain any command-line arguments. You
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 must use @var{args} to provide those.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
101 If you want to use features of the shell, then invoke the shell directly
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
102 using, for example, @var{program} of @code{"sh"}, and @var{args} of
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
103 @code{"-c"} and @var{"command line..."}.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
104
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 The subprocess gets its current directory from the value of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 @code{default-directory} (@pxref{File Name Expansion}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 @cindex environment variables, subprocesses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 The subprocess inherits its environment from XEmacs; but you can
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 specify overrides for it with @code{process-environment}. @xref{System
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 Environment}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
113 @defvar exec-directory
4771
e0b8ef850996 Remove more obsolete files.
Jerry James <james@xemacs.org>
parents: 444
diff changeset
114 @pindex etags
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 The value of this variable is the name of a directory (a string) that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 contains programs that come with XEmacs, that are intended for XEmacs
4771
e0b8ef850996 Remove more obsolete files.
Jerry James <james@xemacs.org>
parents: 444
diff changeset
117 to invoke. The program @code{etags} is an example of such a program.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 @end defvar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 @defopt exec-path
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 The value of this variable is a list of directories to search for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 programs to run in subprocesses. Each element is either the name of a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 directory (i.e., a string), or @code{nil}, which stands for the default
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 directory (which is the value of @code{default-directory}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 @cindex program directories
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 The value of @code{exec-path} is used by @code{call-process} and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 @code{start-process} when the @var{program} argument is not an absolute
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 file name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 @end defopt
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 @node Synchronous Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 @section Creating a Synchronous Process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 @cindex synchronous subprocess
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 After a @dfn{synchronous process} is created, XEmacs waits for the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 process to terminate before continuing. Starting Dired is an example of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 this: it runs @code{ls} in a synchronous process, then modifies the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 output slightly. Because the process is synchronous, the entire
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 directory listing arrives in the buffer before XEmacs tries to do
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 anything with it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 While Emacs waits for the synchronous subprocess to terminate, the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 user can quit by typing @kbd{C-g}. The first @kbd{C-g} tries to kill
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 the subprocess with a @code{SIGINT} signal; but it waits until the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 subprocess actually terminates before quitting. If during that time the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 user types another @kbd{C-g}, that kills the subprocess instantly with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 @code{SIGKILL} and quits immediately. @xref{Quitting}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 The synchronous subprocess functions returned @code{nil} in version
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 18. In version 19, they return an indication of how the process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 terminated.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 @defun call-process program &optional infile destination display &rest args
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 This function calls @var{program} in a separate process and waits for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 it to finish.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 The standard input for the process comes from file @var{infile} if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 @var{infile} is not @code{nil} and from @file{/dev/null} otherwise.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 The argument @var{destination} says where to put the process output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 Here are the possibilities:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 @table @asis
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 @item a buffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 Insert the output in that buffer, before point. This includes both the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 standard output stream and the standard error stream of the process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 @item a string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 Find or create a buffer with that name, then insert
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 the output in that buffer, before point.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 @item @code{t}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 Insert the output in the current buffer, before point.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 @item @code{nil}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 Discard the output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 @item 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 Discard the output, and return immediately without waiting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 for the subprocess to finish.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 In this case, the process is not truly synchronous, since it can run in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 parallel with Emacs; but you can think of it as synchronous in that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 Emacs is essentially finished with the subprocess as soon as this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 function returns.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 @item (@var{real-destination} @var{error-destination})
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 Keep the standard output stream separate from the standard error stream;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 deal with the ordinary output as specified by @var{real-destination},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 and dispose of the error output according to @var{error-destination}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 The value @code{nil} means discard it, @code{t} means mix it with the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 ordinary output, and a string specifies a file name to redirect error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 output into.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 You can't directly specify a buffer to put the error output in; that is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 too difficult to implement. But you can achieve this result by sending
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 the error output to a temporary file and then inserting the file into a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 @end table
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 If @var{display} is non-@code{nil}, then @code{call-process} redisplays
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 the buffer as output is inserted. Otherwise the function does no
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 redisplay, and the results become visible on the screen only when XEmacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 redisplays that buffer in the normal course of events.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 The remaining arguments, @var{args}, are strings that specify command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 line arguments for the program.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 The value returned by @code{call-process} (unless you told it not to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 wait) indicates the reason for process termination. A number gives the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 exit status of the subprocess; 0 means success, and any other value
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 means failure. If the process terminated with a signal,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 @code{call-process} returns a string describing the signal.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 In the examples below, the buffer @samp{foo} is current.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 (call-process "pwd" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 /usr/user/lewis/manual
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 (call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 ---------- Buffer: bar ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 ---------- Buffer: bar ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 The @code{insert-directory} function contains a good example of the use
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 of @code{call-process}:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 (call-process insert-directory-program nil t nil switches
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 (if full-directory-p
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 (concat (file-name-as-directory file) ".")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
251 @defun call-process-region start end program &optional deletep destination displayp &rest args
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 This function sends the text between @var{start} to @var{end} as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 standard input to a process running @var{program}. It deletes the text
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
254 sent if @var{deletep} is non-@code{nil}; this is useful when @var{buffer}
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 is @code{t}, to insert the output in the current buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
257 The arguments @var{destination} and @var{displayp} control what to do
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 with the output from the subprocess, and whether to update the display
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 as it comes in. For details, see the description of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 @code{call-process}, above. If @var{destination} is the integer 0,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 @code{call-process-region} discards the output and returns @code{nil}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 immediately, without waiting for the subprocess to finish.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 The remaining arguments, @var{args}, are strings that specify command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 line arguments for the program.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 The return value of @code{call-process-region} is just like that of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 @code{call-process}: @code{nil} if you told it to return without
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 waiting; otherwise, a number or string which indicates how the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 subprocess terminated.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 In the following example, we use @code{call-process-region} to run the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 @code{cat} utility, with standard input being the first five characters
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 in buffer @samp{foo} (the word @samp{input}). @code{cat} copies its
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 standard input into its standard output. Since the argument
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 @var{destination} is @code{t}, this output is inserted in the current
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 input@point{}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 (call-process-region 1 6 "cat" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 inputinput@point{}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 The @code{shell-command-on-region} command uses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 @code{call-process-region} like this:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 @group
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
301 (call-process-region
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
302 start end
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 shell-file-name ; @r{Name of program.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 nil ; @r{Do not delete region.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 buffer ; @r{Send output to @code{buffer}.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 nil ; @r{No redisplay during output.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 "-c" command) ; @r{Arguments for the shell.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 @node MS-DOS Subprocesses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 @section MS-DOS Subprocesses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 On MS-DOS, you must indicate whether the data going to and from
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 a synchronous subprocess are text or binary. Text data requires
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 translation between the end-of-line convention used within Emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 (a single newline character) and the convention used outside Emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 (the two-character sequence, @sc{crlf}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 The variable @code{binary-process-input} applies to input sent to the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 subprocess, and @code{binary-process-output} applies to output received
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 from it. A non-@code{nil} value means the data is non-text; @code{nil}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 means the data is text, and calls for conversion.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 @defvar binary-process-input
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 If this variable is @code{nil}, convert newlines to @sc{crlf} sequences in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 the input to a synchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 @end defvar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 @defvar binary-process-output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 If this variable is @code{nil}, convert @sc{crlf} sequences to newlines in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333 the output from a synchronous subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 @end defvar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 @xref{Files and MS-DOS}, for related information.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 @node Asynchronous Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 @section Creating an Asynchronous Process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 @cindex asynchronous subprocess
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 After an @dfn{asynchronous process} is created, Emacs and the Lisp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 program both continue running immediately. The process may thereafter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 run in parallel with Emacs, and the two may communicate with each other
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 using the functions described in following sections. Here we describe
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 how to create an asynchronous process with @code{start-process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 @defun start-process name buffer-or-name program &rest args
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 This function creates a new asynchronous subprocess and starts the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 program @var{program} running in it. It returns a process object that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 stands for the new subprocess in Lisp. The argument @var{name}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 specifies the name for the process object; if a process with this name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 already exists, then @var{name} is modified (by adding @samp{<1>}, etc.)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 to be unique. The buffer @var{buffer-or-name} is the buffer to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 associate with the process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 The remaining arguments, @var{args}, are strings that specify command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 line arguments for the program.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 In the example below, the first process is started and runs (rather,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 sleeps) for 100 seconds. Meanwhile, the second process is started, and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 given the name @samp{my-process<1>} for the sake of uniqueness. It
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 inserts the directory listing at the end of the buffer @samp{foo},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 before the first process finishes. Then it finishes, and a message to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 that effect is inserted in the buffer. Much later, the first process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 finishes, and another message is inserted in the buffer for it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 (start-process "my-process" "foo" "sleep" "100")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 @result{} #<process my-process>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 (start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 @result{} #<process my-process<1>>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 total 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 lrwxrwxrwx 1 lewis 14 Jul 22 10:12 gnuemacs --> /emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 -rwxrwxrwx 1 lewis 19 Jul 30 21:02 lemon
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 Process my-process<1> finished
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 Process my-process finished
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 ---------- Buffer: foo ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 @defun start-process-shell-command name buffer-or-name command &rest command-args
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 This function is like @code{start-process} except that it uses a shell
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 to execute the specified command. The argument @var{command} is a shell
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394 command name, and @var{command-args} are the arguments for the shell
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 command.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 @defvar process-connection-type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 @cindex pipes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 @cindex @sc{pty}s
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401 This variable controls the type of device used to communicate with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 asynchronous subprocesses. If it is non-@code{nil}, then @sc{pty}s are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 used, when available. Otherwise, pipes are used.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405 @sc{pty}s are usually preferable for processes visible to the user, as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 in Shell mode, because they allow job control (@kbd{C-c}, @kbd{C-z},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 etc.) to work between the process and its children whereas pipes do not.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 For subprocesses used for internal purposes by programs, it is often
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 better to use a pipe, because they are more efficient. In addition, the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 total number of @sc{pty}s is limited on many systems and it is good not
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
411 to waste them. A rule of thumb is to use ptys for processes the user
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
412 interacts with directly, and pipes for processes that are hidden from
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
413 the user.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 The value @code{process-connection-type} is used when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 @code{start-process} is called. So you can specify how to communicate
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 with one subprocess by binding the variable around the call to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 @code{start-process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422 (let ((process-connection-type nil)) ; @r{Use a pipe.}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 (start-process @dots{}))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 To determine whether a given subprocess actually got a pipe or a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 @sc{pty}, use the function @code{process-tty-name} (@pxref{Process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 Information}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 @end defvar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
432 Lisp functions that manipulate processes usually accept a @var{process}
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
433 argument. Besides using an actual process object for this argument, you
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
434 can use a process name, a buffer object, the name of a buffer, or
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
435 @code{nil}. Specifying a buffer or buffer name for the @var{process}
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
436 argument means use the process associated with the buffer (or the most
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
437 recent one, if there is more than one). @code{nil} means use the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
438 process associated with the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
439 @xref{Process Information}.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
440 @xref{Process Buffers}.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
441
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 @node Deleting Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 @section Deleting Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 @cindex deleting processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 @dfn{Deleting a process} disconnects XEmacs immediately from the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 subprocess, and removes it from the list of active processes. It sends
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448 a signal to the subprocess to make the subprocess terminate, but this is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 not guaranteed to happen immediately. The process object itself
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450 continues to exist as long as other Lisp objects point to it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 You can delete a process explicitly at any time. Processes are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 deleted automatically after they terminate, but not necessarily right
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 away. If you delete a terminated process explicitly before it is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 deleted automatically, no harm results.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 @defvar delete-exited-processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458 This variable controls automatic deletion of processes that have
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 terminated (due to calling @code{exit} or to a signal). If it is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460 @code{nil}, then they continue to exist until the user runs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
461 @code{list-processes}. Otherwise, they are deleted immediately after
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
462 they exit.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
463 @end defvar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
464
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 @defun delete-process name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 This function deletes the process associated with @var{name}, killing it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
467 with a @code{SIGHUP} signal. The argument @var{name} may be a process,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 the name of a process, a buffer, or the name of a buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 (delete-process "*shell*")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
478 @defun process-kill-without-query process &optional require-query-p
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
479 This function declares that XEmacs need not query the user if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480 @var{process} is still running when XEmacs is exited. The process will
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 be deleted silently. If @var{require-query-p} is non-@code{nil},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 then XEmacs @emph{will} query the user (this is the default). The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483 return value is @code{t} if a query was formerly required, and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484 @code{nil} otherwise.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
485
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
486 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
487 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
488 (process-kill-without-query (get-process "shell"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
489 @result{} t
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
490 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
491 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
492 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
493
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
494 @node Process Information
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
495 @section Process Information
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
496
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
497 Several functions return information about processes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
498 @code{list-processes} is provided for interactive use.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
499
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
500 @deffn Command list-processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
501 This command displays a listing of all living processes. In addition,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
502 it finally deletes any process whose status was @samp{Exited} or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503 @samp{Signaled}. It returns @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 @end deffn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506 @defun process-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 This function returns a list of all processes that have not been deleted.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511 (process-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 @result{} (#<process display-time> #<process shell>)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
517 @defun get-process process-name
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
518 This function returns the process named @var{process-name}. If
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
519 @var{process-name} is a string and there is no process with that name, the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
520 value is @code{nil}. If @var{process-name} is actually a process, it is
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
521 returned as given. (That is not very useful, so the argument is usually
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
522 a name.) For example:
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526 (get-process "shell")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 @result{} #<process shell>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
531
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
532 @defun process-command process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
533 This function returns the command that was executed to start
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
534 @var{process}. This is a list of strings, the first string being the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
535 program executed and the rest of the strings being the arguments that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
536 were given to the program.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
537
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
538 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
539 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
540 (process-command (get-process "shell"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
541 @result{} ("/bin/csh" "-i")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
542 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
543 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
544 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
545
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
546 @defun process-id process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
547 This function returns the @sc{pid} of @var{process}. This is an
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
548 integer that distinguishes the process @var{process} from all other
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
549 processes running on the same computer at the current time. The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
550 @sc{pid} of a process is chosen by the operating system kernel when the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
551 process is started and remains constant as long as the process exists.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
552 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
553
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
554 @defun process-name process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
555 This function returns the name of @var{process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
556 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
557
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
558 @defun process-status process
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
559 This function returns the status of @var{process} as a symbol.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
560 The argument @var{process} must be a process, a buffer, a
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
561 process name (string) or a buffer name (string).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
562
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
563 The possible values for an actual subprocess are:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
564
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
565 @table @code
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
566 @item run
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
567 for a process that is running.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
568 @item stop
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
569 for a process that is stopped but continuable.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
570 @item exit
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
571 for a process that has exited.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
572 @item signal
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
573 for a process that has received a fatal signal.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
574 @item open
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
575 for a network connection that is open.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
576 @item closed
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
577 for a network connection that is closed. Once a connection
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
578 is closed, you cannot reopen it, though you might be able to open
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
579 a new connection to the same place.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
580 @item nil
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
581 if @var{process} does not identify an existing process.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
582 @end table
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
583
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
584 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
585 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
586 (process-status "shell")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
587 @result{} run
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
588 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
589 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
590 (process-status (get-buffer "*shell*"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
591 @result{} run
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
592 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
593 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
594 x
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
595 @result{} #<process xx<1>>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
596 (process-status x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
597 @result{} exit
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
598 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
599 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
600
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
601 For a network connection, @code{process-status} returns one of the symbols
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
602 @code{open} or @code{closed}. The latter means that the other side
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
603 closed the connection, or XEmacs did @code{delete-process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
604
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
605 In earlier Emacs versions (prior to version 19), the status of a network
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
606 connection was @code{run} if open, and @code{exit} if closed.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
607 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
608
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
609 @defun process-kill-without-query-p process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
610 This function returns whether @var{process} will be killed without
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
611 querying the user, if it is running when XEmacs is exited. The default
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
612 value is @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
613 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
614
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
615 @defun process-exit-status process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
616 This function returns the exit status of @var{process} or the signal
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
617 number that killed it. (Use the result of @code{process-status} to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
618 determine which of those it is.) If @var{process} has not yet
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
619 terminated, the value is 0.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
620 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
621
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
622 @defun process-tty-name process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
623 This function returns the terminal name that @var{process} is using for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
624 its communication with Emacs---or @code{nil} if it is using pipes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
625 instead of a terminal (see @code{process-connection-type} in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
626 @ref{Asynchronous Processes}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
627 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
628
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
629 @node Input to Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
630 @section Sending Input to Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
631 @cindex process input
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
632
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
633 Asynchronous subprocesses receive input when it is sent to them by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
634 XEmacs, which is done with the functions in this section. You must
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
635 specify the process to send input to, and the input data to send. The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
636 data appears on the ``standard input'' of the subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
637
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
638 Some operating systems have limited space for buffered input in a
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
639 @sc{pty}. On these systems, XEmacs sends long input in chunks, with
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
640 @sc{eof} characters added amidst the other characters, to force the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
641 operating system to periodically drain the input buffer. For most
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
642 programs, these @sc{eof}s do no harm.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
643
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
644 @defun process-send-string process string &optional start end
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
645 This function sends @var{process} the contents of @var{string} as
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
646 standard input.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
647
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
648 The argument @var{process} may be a process or the name of a process, or
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
649 a buffer or the name of a buffer, in which case the buffer's process is
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
650 used. If it is @code{nil}, the current buffer's process is used.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
651
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
652 Optional arguments @var{start} and @var{end} specify part of @var{string};
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4885
diff changeset
653 see @code{subseq}.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
654
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
655 The function returns @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
656
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
657 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
658 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
659 (process-send-string "shell<1>" "ls\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
660 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
661 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
662
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
663
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
664 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
665 ---------- Buffer: *shell* ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
666 ...
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
667 introduction.texi syntax-tables.texi~
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
668 introduction.texi~ text.texi
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
669 introduction.txt text.texi~
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
670 ...
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
671 ---------- Buffer: *shell* ----------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
672 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
673 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
674 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
675
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
676 @defun process-send-region process start end &optional buffer
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
677 This function sends the text in the region defined by @var{start} and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
678 @var{end} as standard input to @var{process}.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
679
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
680 The argument @var{process} may be a process or the name of a process, or
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
681 a buffer or the name of a buffer, in which case the buffer's process is
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
682 used. If it is @code{nil}, the current buffer's process is used.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
683
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
684 An error is signaled unless both @var{start} and @var{end} are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
685 integers or markers that indicate positions in the current buffer. (It
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
686 is unimportant which number is larger.)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
687 @end defun
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
688
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
689 @defun process-send-eof &optional process
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
690 This function makes @var{process} see an end-of-file in its
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
691 input. The @sc{eof} comes after any text already sent to it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
692
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
693 @var{process} may be a process, a buffer, the name of a process or
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
694 buffer, or @code{nil}, indicating the current buffer's process. An
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
695 error is signaled if @var{process} does not identify any process.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
696
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
697 The function returns the process object identified by @var{process}.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
698
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
699 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
700 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
701 (process-send-eof "shell")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
702 @result{} "shell"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
703 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
704 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
705 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
706
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
707 @node Signals to Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
708 @section Sending Signals to Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
709 @cindex process signals
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
710 @cindex sending signals
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
711 @cindex signals
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
712
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
713 @dfn{Sending a signal} to a subprocess is a way of interrupting its
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
714 activities. There are several different signals, each with its own
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
715 meaning. The set of signals and their names is defined by the operating
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
716 system. For example, the signal @code{SIGINT} means that the user has
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
717 typed @kbd{C-c}, or that some analogous thing has happened.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
718
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
719 Each signal has a standard effect on the subprocess. Most signals
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
720 kill the subprocess, but some stop or resume execution instead. Most
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
721 signals can optionally be handled by programs; if the program handles
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
722 the signal, then we can say nothing in general about its effects.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
723
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
724 The set of signals and their names is defined by the operating system;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
725 XEmacs has facilities for sending only a few of the signals that are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
726 defined. XEmacs can send signals only to its own subprocesses.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
727
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
728 You can send signals explicitly by calling the functions in this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
729 section. XEmacs also sends signals automatically at certain times:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
730 killing a buffer sends a @code{SIGHUP} signal to all its associated
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
731 processes; killing XEmacs sends a @code{SIGHUP} signal to all remaining
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
732 processes. (@code{SIGHUP} is a signal that indicates that the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
733 connection between the user and the process is broken, for example if a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
734 connection via a telephone line is hung up.)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
735
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
736 Each of the signal-sending functions takes two optional arguments:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
737 @var{process} and @var{current-group}.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
738
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
739 The argument @var{process} must be either a process or a buffer,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
740 the name of one, or @code{nil}. If it is @code{nil}, the process
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
741 defaults to the process associated with the current buffer. An error is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
742 signaled if @var{process} does not identify a process.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
743
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
744 The argument @var{current-group} is a flag that makes a difference
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
745 when you are running a job-control shell as an XEmacs subprocess. If it
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
746 is non-@code{nil}, then the signal is sent to the current foreground
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
747 process group of the terminal that XEmacs uses to communicate with the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
748 subprocess. If the process is a job-control shell, this means the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
749 shell's current subjob. If it is @code{nil}, the signal is sent to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
750 process group of the immediate subprocess of XEmacs. If the subprocess
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
751 is a job-control shell, this is the shell itself.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
752
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
753 The flag @var{current-group} has no effect when a pipe is used to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
754 communicate with the subprocess, because the operating system does not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
755 support the distinction in the case of pipes. For the same reason,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
756 job-control shells won't work when a pipe is used. See
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
757 @code{process-connection-type} in @ref{Asynchronous Processes}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
758
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
759 Some of the functions below take a @var{signal} argument, which
4885
6772ce4d982b Fix hash tables, #'member*, #'assoc*, #'eql compiler macros if bignums
Aidan Kehoe <kehoea@parhasard.net>
parents: 4771
diff changeset
760 identifies a signal to be sent. It must be either a fixnum or a
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
761 symbol which names the signal, like @code{SIGSEGV}.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
762
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
763 @defun process-send-signal signal &optional process current-group
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
764 This function sends the signal @var{signal} to the process @var{process}.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
765 The following functions can be implemented in terms of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
766 @code{process-send-signal}.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
767 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
768
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
769 @defun interrupt-process &optional process current-group
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
770 This function interrupts the process @var{process} by sending the signal
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
771 @code{SIGINT}. Outside of XEmacs, typing the ``interrupt character''
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
772 (normally @kbd{C-c}) sends this signal. When the argument
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
773 @var{current-group} is non-@code{nil}, you can think of this function as
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
774 ``typing @kbd{C-c}'' on the terminal by which XEmacs talks to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
775 subprocess.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
776 @end defun
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
777
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
778 @defun kill-process &optional process current-group
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
779 This function kills the process @var{process} by sending the
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
780 signal @code{SIGKILL}. This signal kills the subprocess immediately,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
781 and cannot be handled by the subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
782 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
783
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
784 @defun quit-process &optional process current-group
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
785 This function sends the signal @code{SIGQUIT} to the process
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
786 @var{process}. This signal is the one sent by the ``quit
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
787 character'' (usually @kbd{C-\}) when you are not inside XEmacs.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
788 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
789
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
790 @defun stop-process &optional process current-group
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
791 This function stops the process @var{process} by sending the
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
792 signal @code{SIGTSTP}. Use @code{continue-process} to resume its
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
793 execution.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
794
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
795 On systems with job control, the ``stop character'' (usually @kbd{C-z})
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
796 sends this signal (outside of XEmacs). When @var{current-group} is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
797 non-@code{nil}, you can think of this function as ``typing @kbd{C-z}''
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
798 on the terminal XEmacs uses to communicate with the subprocess.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
799 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
800
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
801 @defun continue-process &optional process current-group
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
802 This function resumes execution of the process @var{process} by sending
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
803 it the signal @code{SIGCONT}. This presumes that @var{process} was
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
804 stopped previously.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
805 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
806
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
807 @deffn Command signal-process pid signal
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
808 This function sends a signal to the process with process id @var{pid},
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
809 which need not be a child of XEmacs. The argument @var{signal}
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
810 specifies which signal to send.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
811 @end deffn
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
812
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
813 @node Output from Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
814 @section Receiving Output from Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
815 @cindex process output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
816 @cindex output from processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
817
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
818 There are two ways to receive the output that a subprocess writes to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
819 its standard output stream. The output can be inserted in a buffer,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
820 which is called the associated buffer of the process, or a function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
821 called the @dfn{filter function} can be called to act on the output. If
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
822 the process has no buffer and no filter function, its output is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
823 discarded.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
824
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
825 @menu
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
826 * Process Buffers:: If no filter, output is put in a buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
827 * Filter Functions:: Filter functions accept output from the process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
828 * Accepting Output:: Explicitly permitting subprocess output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
829 Waiting for subprocess output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
830 @end menu
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
831
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
832 @node Process Buffers
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
833 @subsection Process Buffers
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
834
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
835 A process can (and usually does) have an @dfn{associated buffer},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
836 which is an ordinary Emacs buffer that is used for two purposes: storing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
837 the output from the process, and deciding when to kill the process. You
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
838 can also use the buffer to identify a process to operate on, since in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
839 normal practice only one process is associated with any given buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
840 Many applications of processes also use the buffer for editing input to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
841 be sent to the process, but this is not built into XEmacs Lisp.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
842
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
843 Unless the process has a filter function (@pxref{Filter Functions}),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
844 its output is inserted in the associated buffer. The position to insert
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
845 the output is determined by the @code{process-mark}, which is then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
846 updated to point to the end of the text just inserted. Usually, but not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
847 always, the @code{process-mark} is at the end of the buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
848
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
849 @defun process-buffer process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
850 This function returns the associated buffer of the process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
851 @var{process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
852
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
853 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
854 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
855 (process-buffer (get-process "shell"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
856 @result{} #<buffer *shell*>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
857 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
858 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
859 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
860
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
861 @defun process-mark process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
862 This function returns the process marker for @var{process}, which is the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
863 marker that says where to insert output from the process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
864
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
865 If @var{process} does not have a buffer, @code{process-mark} returns a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
866 marker that points nowhere.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
867
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
868 Insertion of process output in a buffer uses this marker to decide where
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
869 to insert, and updates it to point after the inserted text. That is why
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
870 successive batches of output are inserted consecutively.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
871
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
872 Filter functions normally should use this marker in the same fashion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
873 as is done by direct insertion of output in the buffer. A good
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
874 example of a filter function that uses @code{process-mark} is found at
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
875 the end of the following section.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
876
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
877 When the user is expected to enter input in the process buffer for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
878 transmission to the process, the process marker is useful for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
879 distinguishing the new input from previous output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
880 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
881
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
882 @defun set-process-buffer process buffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
883 This function sets the buffer associated with @var{process} to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
884 @var{buffer}. If @var{buffer} is @code{nil}, the process becomes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
885 associated with no buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
886 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
887
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
888 @defun get-buffer-process buffer-or-name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
889 This function returns the process associated with @var{buffer-or-name}.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
890 If there are several processes associated with @var{buffer-or-name},
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
891 then one is chosen. (Presently, the one chosen is the one most recently
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
892 created.) It is usually a bad idea to have more than one process
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
893 associated with the same buffer.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
894
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
895 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
896 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
897 (get-buffer-process "*shell*")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
898 @result{} #<process shell>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
899 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
900 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
901
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
902 Killing the process's buffer deletes the process, which kills the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
903 subprocess with a @code{SIGHUP} signal (@pxref{Signals to Processes}).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
904 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
905
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
906 @node Filter Functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
907 @subsection Process Filter Functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
908 @cindex filter function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
909 @cindex process filter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
910
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
911 A process @dfn{filter function} is a function that receives the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
912 standard output from the associated process. If a process has a filter,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
913 then @emph{all} output from that process is passed to the filter. The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
914 process buffer is used directly for output from the process only when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
915 there is no filter.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
916
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
917 A filter function must accept two arguments: the associated process and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
918 a string, which is the output. The function is then free to do whatever it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
919 chooses with the output.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
920
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
921 A filter function runs only while XEmacs is waiting (e.g., for terminal
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
922 input, or for time to elapse, or for process output). This avoids the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
923 timing errors that could result from running filters at random places in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
924 the middle of other Lisp programs. You may explicitly cause Emacs to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
925 wait, so that filter functions will run, by calling @code{sit-for} or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
926 @code{sleep-for} (@pxref{Waiting}), or @code{accept-process-output}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
927 (@pxref{Accepting Output}). Emacs is also waiting when the command loop
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
928 is reading input.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
929
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
930 Quitting is normally inhibited within a filter function---otherwise,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
931 the effect of typing @kbd{C-g} at command level or to quit a user
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
932 command would be unpredictable. If you want to permit quitting inside a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
933 filter function, bind @code{inhibit-quit} to @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
934 @xref{Quitting}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
935
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
936 If an error happens during execution of a filter function, it is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
937 caught automatically, so that it doesn't stop the execution of whatever
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
938 program was running when the filter function was started. However, if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
939 @code{debug-on-error} is non-@code{nil}, the error-catching is turned
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
940 off. This makes it possible to use the Lisp debugger to debug the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
941 filter function. @xref{Debugger}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
942
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
943 Many filter functions sometimes or always insert the text in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
944 process's buffer, mimicking the actions of XEmacs when there is no
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
945 filter. Such filter functions need to use @code{set-buffer} in order to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
946 be sure to insert in that buffer. To avoid setting the current buffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
947 semipermanently, these filter functions must use @code{unwind-protect}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
948 to make sure to restore the previous current buffer. They should also
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
949 update the process marker, and in some cases update the value of point.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
950 Here is how to do these things:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
951
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
952 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
953 @group
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
954 (defun ordinary-insertion-filter (process string)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
955 (let ((old-buffer (current-buffer)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
956 (unwind-protect
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
957 (let (moving)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
958 (set-buffer (process-buffer process))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
959 (setq moving (= (point) (process-mark process)))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
960 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
961 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
962 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
963 ;; @r{Insert the text, moving the process-marker.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
964 (goto-char (process-mark process))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
965 (insert string)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
966 (set-marker (process-mark process) (point)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
967 (if moving (goto-char (process-mark process))))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
968 (set-buffer old-buffer))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
969 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
970 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
971
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
972 @noindent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
973 The reason to use an explicit @code{unwind-protect} rather than letting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
974 @code{save-excursion} restore the current buffer is so as to preserve
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
975 the change in point made by @code{goto-char}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
976
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
977 To make the filter force the process buffer to be visible whenever new
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
978 text arrives, insert the following line just before the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
979 @code{unwind-protect}:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
980
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
981 @smallexample
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
982 (display-buffer (process-buffer process))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
983 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
984
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
985 To force point to move to the end of the new output no matter where
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
986 it was previously, eliminate the variable @code{moving} and call
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
987 @code{goto-char} unconditionally.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
988
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
989 In earlier Emacs versions, every filter function that did regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
990 searching or matching had to explicitly save and restore the match data.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
991 Now Emacs does this automatically; filter functions never need to do it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
992 explicitly. @xref{Match Data}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
993
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
994 A filter function that writes the output into the buffer of the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
995 process should check whether the buffer is still alive. If it tries to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
996 insert into a dead buffer, it will get an error. If the buffer is dead,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
997 @code{(buffer-name (process-buffer @var{process}))} returns @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
998
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
999 The output to the function may come in chunks of any size. A program
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1000 that produces the same output twice in a row may send it as one batch
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1001 of 200 characters one time, and five batches of 40 characters the next.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1002
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1003 @defun set-process-filter process filter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1004 This function gives @var{process} the filter function @var{filter}. If
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1005 @var{filter} is @code{nil}, then the process will have no filter. If
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1006 @var{filter} is @code{t}, then no output from the process will be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1007 accepted until the filter is changed. (Output received during this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1008 time is not discarded, but is queued, and will be processed as soon
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1009 as the filter is changed.)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1010 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1011
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1012 @defun process-filter process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1013 This function returns the filter function of @var{process}, or @code{nil}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1014 if it has none. @code{t} means that output processing has been stopped.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1015 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1016
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1017 Here is an example of use of a filter function:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1018
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1019 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1020 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1021 (defun keep-output (process output)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1022 (setq kept (cons output kept)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1023 @result{} keep-output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1024 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1025 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1026 (setq kept nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1027 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1028 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1029 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1030 (set-process-filter (get-process "shell") 'keep-output)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1031 @result{} keep-output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1032 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1033 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1034 (process-send-string "shell" "ls ~/other\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1035 @result{} nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1036 kept
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1037 @result{} ("lewis@@slug[8] % "
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1038 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1039 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1040 "FINAL-W87-SHORT.MSS backup.otl kolstad.mss~
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1041 address.txt backup.psf kolstad.psf
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1042 backup.bib~ david.mss resume-Dec-86.mss~
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1043 backup.err david.psf resume-Dec.psf
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1044 backup.mss dland syllabus.mss
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1045 "
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1046 "#backups.mss# backup.mss~ kolstad.mss
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1047 ")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1048 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1049 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1050
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1051 @ignore @c The code in this example doesn't show the right way to do things.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1052 Here is another, more realistic example, which demonstrates how to use
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1053 the process mark to do insertion in the same fashion as is done when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1054 there is no filter function:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1055
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1056 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1057 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1058 ;; @r{Insert input in the buffer specified by @code{my-shell-buffer}}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1059 ;; @r{and make sure that buffer is shown in some window.}
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1060 (defun my-process-filter (process string)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1061 (let ((cur (selected-window))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1062 (pop-up-windows t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1063 (pop-to-buffer my-shell-buffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1064 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1065 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1066 (goto-char (point-max))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1067 (insert string)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1068 (set-marker (process-mark process) (point-max))
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1069 (select-window cur)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1070 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1071 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1072 @end ignore
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1073
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1074 @node Accepting Output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1075 @subsection Accepting Output from Processes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1076
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1077 Output from asynchronous subprocesses normally arrives only while
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1078 XEmacs is waiting for some sort of external event, such as elapsed time
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1079 or terminal input. Occasionally it is useful in a Lisp program to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1080 explicitly permit output to arrive at a specific point, or even to wait
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1081 until output arrives from a process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1082
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1083 @defun accept-process-output &optional process seconds millisec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1084 This function allows XEmacs to read pending output from processes. The
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1085 output is inserted in the associated buffers or given to their filter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1086 functions. If @var{process} is non-@code{nil} then this function does
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1087 not return until some output has been received from @var{process}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1088
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1089 @c Emacs 19 feature
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1090 The arguments @var{seconds} and @var{millisec} let you specify timeout
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1091 periods. The former specifies a period measured in seconds and the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1092 latter specifies one measured in milliseconds. The two time periods
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1093 thus specified are added together, and @code{accept-process-output}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1094 returns after that much time whether or not there has been any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1095 subprocess output. Note that @var{seconds} is allowed to be a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1096 floating-point number; thus, there is no need to ever use
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1097 @var{millisec}. (It is retained for compatibility purposes.)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1098 @ignore Not in XEmacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1099
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1100 The argument @var{seconds} need not be an integer. If it is a floating
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1101 point number, this function waits for a fractional number of seconds.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1102 Some systems support only a whole number of seconds; on these systems,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1103 @var{seconds} is rounded down. If the system doesn't support waiting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1104 fractions of a second, you get an error if you specify nonzero
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1105 @var{millisec}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1106
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1107 Not all operating systems support waiting periods other than multiples
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1108 of a second; on those that do not, you get an error if you specify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1109 nonzero @var{millisec}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1110 @end ignore
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1111
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1112 The function @code{accept-process-output} returns non-@code{nil} if it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1113 did get some output, or @code{nil} if the timeout expired before output
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1114 arrived.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1115 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1116
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1117 @node Sentinels
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1118 @section Sentinels: Detecting Process Status Changes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1119 @cindex process sentinel
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1120 @cindex sentinel
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1121
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1122 A @dfn{process sentinel} is a function that is called whenever the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1123 associated process changes status for any reason, including signals
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1124 (whether sent by XEmacs or caused by the process's own actions) that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1125 terminate, stop, or continue the process. The process sentinel is also
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1126 called if the process exits. The sentinel receives two arguments: the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1127 process for which the event occurred, and a string describing the type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1128 of event.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1129
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1130 The string describing the event looks like one of the following:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1131
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1132 @itemize @bullet
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 0
diff changeset
1133 @item
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1134 @code{"finished\n"}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1135
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1136 @item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1137 @code{"exited abnormally with code @var{exitcode}\n"}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1138
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1139 @item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1140 @code{"@var{name-of-signal}\n"}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1141
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1142 @item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1143 @code{"@var{name-of-signal} (core dumped)\n"}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1144 @end itemize
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1145
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1146 A sentinel runs only while XEmacs is waiting (e.g., for terminal input,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1147 or for time to elapse, or for process output). This avoids the timing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1148 errors that could result from running them at random places in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1149 middle of other Lisp programs. A program can wait, so that sentinels
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1150 will run, by calling @code{sit-for} or @code{sleep-for}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1151 (@pxref{Waiting}), or @code{accept-process-output} (@pxref{Accepting
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1152 Output}). Emacs is also waiting when the command loop is reading input.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1153
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1154 Quitting is normally inhibited within a sentinel---otherwise, the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1155 effect of typing @kbd{C-g} at command level or to quit a user command
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1156 would be unpredictable. If you want to permit quitting inside a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1157 sentinel, bind @code{inhibit-quit} to @code{nil}. @xref{Quitting}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1158
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1159 A sentinel that writes the output into the buffer of the process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1160 should check whether the buffer is still alive. If it tries to insert
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1161 into a dead buffer, it will get an error. If the buffer is dead,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1162 @code{(buffer-name (process-buffer @var{process}))} returns @code{nil}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1163
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1164 If an error happens during execution of a sentinel, it is caught
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1165 automatically, so that it doesn't stop the execution of whatever
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1166 programs was running when the sentinel was started. However, if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1167 @code{debug-on-error} is non-@code{nil}, the error-catching is turned
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1168 off. This makes it possible to use the Lisp debugger to debug the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1169 sentinel. @xref{Debugger}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1170
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1171 In earlier Emacs versions, every sentinel that did regexp searching or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1172 matching had to explicitly save and restore the match data. Now Emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1173 does this automatically; sentinels never need to do it explicitly.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1174 @xref{Match Data}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1175
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1176 @defun set-process-sentinel process sentinel
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1177 This function associates @var{sentinel} with @var{process}. If
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1178 @var{sentinel} is @code{nil}, then the process will have no sentinel.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1179 The default behavior when there is no sentinel is to insert a message in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1180 the process's buffer when the process status changes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1182 @smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1183 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1184 (defun msg-me (process event)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1185 (princ
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1186 (format "Process: %s had the event `%s'" process event)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1187 (set-process-sentinel (get-process "shell") 'msg-me)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1188 @result{} msg-me
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1189 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1190 @group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1191 (kill-process (get-process "shell"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1192 @print{} Process: #<process shell> had the event `killed'
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1193 @result{} #<process shell>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1194 @end group
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1195 @end smallexample
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1196 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1197
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1198 @defun process-sentinel process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1199 This function returns the sentinel of @var{process}, or @code{nil} if it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1200 has none.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1201 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1202
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1203 @defun waiting-for-user-input-p
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1204 While a sentinel or filter function is running, this function returns
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1205 non-@code{nil} if XEmacs was waiting for keyboard input from the user at
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1206 the time the sentinel or filter function was called, @code{nil} if it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1207 was not.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1208 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1209
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1210 @c XEmacs feature
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1211 @node Process Window Size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1212 @section Process Window Size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1213 @cindex process window size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1215 @defun set-process-window-size process height width
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1216 This function tells @var{process} that its logical window size is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1217 @var{height} by @var{width} characters. This is principally useful
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1218 with pty's.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1219 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1221 @node Transaction Queues
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1222 @section Transaction Queues
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1223 @cindex transaction queue
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1225 You can use a @dfn{transaction queue} for more convenient communication
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1226 with subprocesses using transactions. First use @code{tq-create} to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1227 create a transaction queue communicating with a specified process. Then
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1228 you can call @code{tq-enqueue} to send a transaction.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1229
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1230 @defun tq-create process
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1231 This function creates and returns a transaction queue communicating with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1232 @var{process}. The argument @var{process} should be a subprocess
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1233 capable of sending and receiving streams of bytes. It may be a child
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1234 process, or it may be a TCP connection to a server, possibly on another
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1235 machine.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1236 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1238 @defun tq-enqueue queue question regexp closure fn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1239 This function sends a transaction to queue @var{queue}. Specifying the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1240 queue has the effect of specifying the subprocess to talk to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1241
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1242 The argument @var{question} is the outgoing message that starts the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1243 transaction. The argument @var{fn} is the function to call when the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1244 corresponding answer comes back; it is called with two arguments:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1245 @var{closure}, and the answer received.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1247 The argument @var{regexp} is a regular expression that should match the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1248 entire answer, but nothing less; that's how @code{tq-enqueue} determines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1249 where the answer ends.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1250
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1251 The return value of @code{tq-enqueue} itself is not meaningful.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1252 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1253
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1254 @defun tq-close queue
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1255 Shut down transaction queue @var{queue}, waiting for all pending transactions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1256 to complete, and then terminate the connection or child process.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1257 @end defun
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1258
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1259 Transaction queues are implemented by means of a filter function.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1260 @xref{Filter Functions}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1261
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1262 @node Network
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1263 @section Network Connections
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1264 @cindex network connection
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1265 @cindex TCP
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1266
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1267 XEmacs Lisp programs can open TCP network connections to other processes on
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1268 the same machine or other machines. A network connection is handled by Lisp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1269 much like a subprocess, and is represented by a process object.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1270 However, the process you are communicating with is not a child of the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1271 XEmacs process, so you can't kill it or send it signals. All you can do
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1272 is send and receive data. @code{delete-process} closes the connection,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1273 but does not kill the process at the other end; that process must decide
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1274 what to do about closure of the connection.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1275
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1276 You can distinguish process objects representing network connections
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1277 from those representing subprocesses with the @code{process-status}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1278 function. It always returns either @code{open} or @code{closed} for a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1279 network connection, and it never returns either of those values for a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1280 real subprocess. @xref{Process Information}.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1281
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1282 @defun open-network-stream name buffer-or-name host service &optional protocol
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1283 This function opens a TCP connection for a service to a host. It
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1284 returns a process object to represent the connection.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1285
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1286 Input and output work as for other process objects.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1287 @code{delete-process} closes the connection.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1288
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1289 The @var{name} argument specifies the name for the process object. It
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1290 is modified as necessary to make it unique.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1291
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1292 The @var{buffer-or-name} argument is the buffer to associate with the
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1293 connection. It can be a buffer or the name of one. Output from the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1294 connection is inserted in the buffer, unless you specify a filter
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1295 function to handle the output. If @var{buffer-or-name} is @code{nil},
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1296 it means that the connection is not associated with any buffer.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1297
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1298 The arguments @var{host} and @var{service} specify where to connect to;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1299 @var{host} is the host name or IP address (a string), and @var{service}
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1300 is the name of a defined network service (a string) or a port number (an
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1301 integer).
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1302
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1303 Optional fifth arg @var{protocol} is the network protocol to use.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1304 Currently only @code{tcp} (Transmission Control Protocol) and @code{udp}
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1305 (User Datagram Protocol) are supported. When omitted, @code{tcp} is assumed.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1306
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1307 Output via @code{process-send-string} and input via buffer or filter
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1308 (see @code{set-process-filter}) are stream-oriented. That means
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1309 UDP datagrams are not guaranteed to be sent and received in
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1310 discrete packets. (But small datagrams around 500 bytes that are not
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1311 truncated by @code{process-send-string} are usually fine.) Note further
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1312 that the UDP protocol does not guard against lost packets.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1313 @end defun