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:
Richard M. Stallman 2002-04-02 21:20:16 +00:00
parent b1f236d857
commit 5517ea8a30

View file

@ -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)