annotate man/lispref/processes.texi @ 778:2923009caf47

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