New node Query Before Exit broken out of Deleting Processes.
Explain more details of process deletion and sentinels. Document process-query-on-exit-flag and set-process-query-on-exit-flag.
This commit is contained in:
parent
b1f236d857
commit
5517ea8a30
1 changed files with 103 additions and 46 deletions
|
@ -43,6 +43,7 @@ This function returns @code{t} if @var{object} is a process,
|
||||||
* Input to Processes:: Sending input to an asynchronous subprocess.
|
* Input to Processes:: Sending input to an asynchronous subprocess.
|
||||||
* Signals to Processes:: Stopping, continuing or interrupting
|
* Signals to Processes:: Stopping, continuing or interrupting
|
||||||
an asynchronous subprocess.
|
an asynchronous subprocess.
|
||||||
|
* Query Before Exit:: Whether to query if exiting will kill a process.
|
||||||
* Output from Processes:: Collecting output from an asynchronous subprocess.
|
* Output from Processes:: Collecting output from an asynchronous subprocess.
|
||||||
* Sentinels:: Sentinels run when process run-status changes.
|
* Sentinels:: Sentinels run when process run-status changes.
|
||||||
* Transaction Queues:: Transaction-based communication with subprocesses.
|
* Transaction Queues:: Transaction-based communication with subprocesses.
|
||||||
|
@ -481,17 +482,20 @@ Information}).
|
||||||
@cindex deleting processes
|
@cindex deleting processes
|
||||||
|
|
||||||
@dfn{Deleting a process} disconnects Emacs immediately from the
|
@dfn{Deleting a process} disconnects Emacs immediately from the
|
||||||
subprocess, and removes it from the list of active processes. It sends
|
subprocess. Processes are deleted automatically after they terminate,
|
||||||
a signal to the subprocess to make the subprocess terminate, but this is
|
but not necessarily right away. You can delete a process explicitly
|
||||||
not guaranteed to happen immediately. The process object itself
|
at any time. If you delete a terminated process explicitly before it
|
||||||
continues to exist as long as other Lisp objects point to it. The
|
is deleted automatically, no harm results. Deletion of a running
|
||||||
process mark continues to point to the same place as before (usually
|
process sends a signal to terminate it and calls the process sentinel
|
||||||
into a buffer where output from the process was being inserted).
|
if it has one.
|
||||||
|
|
||||||
You can delete a process explicitly at any time. Processes are
|
@code{get-buffer-process} and @code{process-list} do not remember a
|
||||||
deleted automatically after they terminate, but not necessarily right
|
deleted process, but the process object itself continues to exist as
|
||||||
away. If you delete a terminated process explicitly before it is
|
long as other Lisp objects point to it. All the Lisp primitives that
|
||||||
deleted automatically, no harm results.
|
work on process objects accept deleted processes, but those that do
|
||||||
|
I/O or send signals will report an error. The process mark continues
|
||||||
|
to point to the same place as before, usually into a buffer where
|
||||||
|
output from the process was being inserted.
|
||||||
|
|
||||||
@defopt delete-exited-processes
|
@defopt delete-exited-processes
|
||||||
This variable controls automatic deletion of processes that have
|
This variable controls automatic deletion of processes that have
|
||||||
|
@ -502,9 +506,14 @@ they exit.
|
||||||
@end defopt
|
@end defopt
|
||||||
|
|
||||||
@defun delete-process name
|
@defun delete-process name
|
||||||
This function deletes the process associated with @var{name}, killing it
|
This function deletes the process associated with @var{name}, killing
|
||||||
with a @code{SIGHUP} signal. The argument @var{name} may be a process,
|
it with a @code{SIGKILL} signal. The argument @var{name} may be a
|
||||||
the name of a process, a buffer, or the name of a buffer.
|
process, the name of a process, a buffer, or the name of a buffer.
|
||||||
|
Calling @code{delete-process} on a running process terminates it,
|
||||||
|
updates the process status, and runs the sentinel (if any) immediately.
|
||||||
|
If the process has already terminated, calling @code{delete-process}
|
||||||
|
has no effect on its status, or on the running of its sentinel (which
|
||||||
|
will happen sooner or later).
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
@group
|
@group
|
||||||
|
@ -514,24 +523,6 @@ the name of a process, a buffer, or the name of a buffer.
|
||||||
@end smallexample
|
@end smallexample
|
||||||
@end defun
|
@end defun
|
||||||
|
|
||||||
@defun process-kill-without-query process &optional do-query
|
|
||||||
This function specifies whether Emacs should query the user if
|
|
||||||
@var{process} is still running when Emacs is exited. If @var{do-query}
|
|
||||||
is @code{nil}, the process will be deleted silently.
|
|
||||||
Otherwise, Emacs will query about killing it.
|
|
||||||
|
|
||||||
The value is @code{t} if the process was formerly set up to require
|
|
||||||
query, @code{nil} otherwise. A newly-created process always requires
|
|
||||||
query.
|
|
||||||
|
|
||||||
@smallexample
|
|
||||||
@group
|
|
||||||
(process-kill-without-query (get-process "shell"))
|
|
||||||
@result{} t
|
|
||||||
@end group
|
|
||||||
@end smallexample
|
|
||||||
@end defun
|
|
||||||
|
|
||||||
@node Process Information
|
@node Process Information
|
||||||
@section Process Information
|
@section Process Information
|
||||||
|
|
||||||
|
@ -864,6 +855,56 @@ a child of Emacs. The argument @var{signal} specifies which signal
|
||||||
to send; it should be an integer.
|
to send; it should be an integer.
|
||||||
@end defun
|
@end defun
|
||||||
|
|
||||||
|
@node Query Before Exit
|
||||||
|
@section Querying Before Exit
|
||||||
|
|
||||||
|
When Emacs exits, it terminates all its subprocesses by sending them
|
||||||
|
the @code{SIGHUP} signal. Because some subprocesses are doing
|
||||||
|
valuable work, Emacs normally asks the user to confirm that it is ok
|
||||||
|
to terminate them. Each process has a query flag which, if
|
||||||
|
non-@code{nil}, says that Emacs should ask for confirmation before
|
||||||
|
exiting and thus killing that process. The default for the query flag
|
||||||
|
is @code{t}, meaning @emph{do} query.
|
||||||
|
|
||||||
|
@tindex process-query-on-exit-flag
|
||||||
|
@defun process-query-on-exit-flag process
|
||||||
|
This returns the query flag of @var{process}.
|
||||||
|
@end defun
|
||||||
|
|
||||||
|
@tindex set-process-query-on-exit-flag
|
||||||
|
@defun set-process-query-on-exit-flag process flag
|
||||||
|
This function sets the query flag of @var{process} to @var{flag}. It
|
||||||
|
returns @var{flag}.
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
@group
|
||||||
|
;; @r{Don't query about the shell process}
|
||||||
|
(set-process-query-on-exit-flag (get-process "shell") nil)
|
||||||
|
@result{} t
|
||||||
|
@end group
|
||||||
|
@end smallexample
|
||||||
|
@end defun
|
||||||
|
|
||||||
|
@defun process-kill-without-query process &optional do-query
|
||||||
|
This function clears the query flag of @var{process}, so that
|
||||||
|
Emacs will not query the user on account of that process.
|
||||||
|
|
||||||
|
Actually, the function does more than that: it returns the old value of
|
||||||
|
the process's query flag, and sets the query flag to @var{do-query}.
|
||||||
|
Please don't use this function to do those things any more---please
|
||||||
|
use the newer, cleaner functions @code{process-query-on-exit-flag} and
|
||||||
|
@code{set-process-query-on-exit-flag} in all but the simplest cases.
|
||||||
|
The only way you should use @code{process-kill-without-query} nowadays
|
||||||
|
is like this:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
@group
|
||||||
|
;; @r{Don't query about the shell process}
|
||||||
|
(process-kill-without-query (get-process "shell"))
|
||||||
|
@end group
|
||||||
|
@end smallexample
|
||||||
|
@end defun
|
||||||
|
|
||||||
@node Output from Processes
|
@node Output from Processes
|
||||||
@section Receiving Output from Processes
|
@section Receiving Output from Processes
|
||||||
@cindex process output
|
@cindex process output
|
||||||
|
@ -974,11 +1015,15 @@ associated with no buffer.
|
||||||
@end defun
|
@end defun
|
||||||
|
|
||||||
@defun get-buffer-process buffer-or-name
|
@defun get-buffer-process buffer-or-name
|
||||||
This function returns the process associated with @var{buffer-or-name}.
|
This function returns a nondeleted process associated with the buffer
|
||||||
If there are several processes associated with it, then one is chosen.
|
specified by @var{buffer-or-name}. If there are several processes
|
||||||
(Currently, the one chosen is the one most recently created.) It is
|
associated with it, this function chooses one (currently, the one most
|
||||||
usually a bad idea to have more than one process associated with the
|
recently created, but don't count on that). Deletion of a process
|
||||||
same buffer.
|
(see @code{delete-process}) makes it ineligible for this function to
|
||||||
|
return.
|
||||||
|
|
||||||
|
It is usually a bad idea to have more than one process associated with
|
||||||
|
the same buffer.
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
@group
|
@group
|
||||||
|
@ -1197,10 +1242,10 @@ arrived.
|
||||||
A @dfn{process sentinel} is a function that is called whenever the
|
A @dfn{process sentinel} is a function that is called whenever the
|
||||||
associated process changes status for any reason, including signals
|
associated process changes status for any reason, including signals
|
||||||
(whether sent by Emacs or caused by the process's own actions) that
|
(whether sent by Emacs or caused by the process's own actions) that
|
||||||
terminate, stop, or continue the process. The process sentinel is also
|
terminate, stop, or continue the process. The process sentinel is
|
||||||
called if the process exits. The sentinel receives two arguments: the
|
also called if the process exits. The sentinel receives two
|
||||||
process for which the event occurred, and a string describing the type
|
arguments: the process for which the event occurred, and a string
|
||||||
of event.
|
describing the type of event.
|
||||||
|
|
||||||
The string describing the event looks like one of the following:
|
The string describing the event looks like one of the following:
|
||||||
|
|
||||||
|
@ -1218,14 +1263,22 @@ of event.
|
||||||
@code{"@var{name-of-signal} (core dumped)\n"}.
|
@code{"@var{name-of-signal} (core dumped)\n"}.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
A sentinel runs only while Emacs is waiting (e.g., for terminal input,
|
A sentinel runs only while Emacs is waiting (e.g., for terminal
|
||||||
or for time to elapse, or for process output). This avoids the timing
|
input, or for time to elapse, or for process output). This avoids the
|
||||||
errors that could result from running them at random places in the
|
timing errors that could result from running them at random places in
|
||||||
middle of other Lisp programs. A program can wait, so that sentinels
|
the middle of other Lisp programs. A program can wait, so that
|
||||||
will run, by calling @code{sit-for} or @code{sleep-for}
|
sentinels will run, by calling @code{sit-for} or @code{sleep-for}
|
||||||
(@pxref{Waiting}), or @code{accept-process-output} (@pxref{Accepting
|
(@pxref{Waiting}), or @code{accept-process-output} (@pxref{Accepting
|
||||||
Output}). Emacs also allows sentinels to run when the command loop is
|
Output}). Emacs also allows sentinels to run when the command loop is
|
||||||
reading input.
|
reading input. @code{delete-process} calls the sentinel when it
|
||||||
|
terminates a running process.
|
||||||
|
|
||||||
|
Emacs does not keep a queue of multiple reasons to call the sentinel
|
||||||
|
of one process; it records just the current status and the fact that
|
||||||
|
there has been a change. Therefore two changes in status, coming in
|
||||||
|
quick succession, can call the sentinel just once. However, process
|
||||||
|
termination will always run the sentinel exactly once. This is
|
||||||
|
because the process status can't change again after termination.
|
||||||
|
|
||||||
Quitting is normally inhibited within a sentinel---otherwise, the
|
Quitting is normally inhibited within a sentinel---otherwise, the
|
||||||
effect of typing @kbd{C-g} at command level or to quit a user command
|
effect of typing @kbd{C-g} at command level or to quit a user command
|
||||||
|
@ -1255,6 +1308,10 @@ This function associates @var{sentinel} with @var{process}. If
|
||||||
The default behavior when there is no sentinel is to insert a message in
|
The default behavior when there is no sentinel is to insert a message in
|
||||||
the process's buffer when the process status changes.
|
the process's buffer when the process status changes.
|
||||||
|
|
||||||
|
Changes in process sentinel take effect immediately---if the sentinel
|
||||||
|
is slated to be run but has not been called yet, and you specify a new
|
||||||
|
sentinel, the eventual call to the sentinel will use the new one.
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
@group
|
@group
|
||||||
(defun msg-me (process event)
|
(defun msg-me (process event)
|
||||||
|
|
Loading…
Add table
Reference in a new issue