From: Dan Nicolaescu Date: Sun, 21 Sep 2008 23:31:40 +0000 (+0000) Subject: * emacs.c (standard_args): Add --daemon. X-Git-Tag: emacs-pretest-23.0.90~2815 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=eab2ee89441d51e885e3df6b3fbcb3c12a177232;p=emacs.git * emacs.c (standard_args): Add --daemon. (main): Disconnect from the terminal when --daemon is passed. (is_daemon): New variable. (Fdaemonp): New function. (syms_of_emacs): Defsubr it. * startup.el (command-line): Start the server when in daemon mode. * cmdargs.texi (Initial Options): Document --daemon. --- diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index bae3e02d302..c3b98fc55de 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,7 @@ +2008-09-21 Dan Nicolaescu + + * cmdargs.texi (Initial Options): Document --daemon. + 2008-09-20 Glenn Morris * files.texi (Numbered Backups): Mention that some modes set diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index 74ebe3c9e1f..1e733755e99 100644 --- a/doc/emacs/cmdargs.texi +++ b/doc/emacs/cmdargs.texi @@ -277,6 +277,15 @@ option and @samp{-Q} are the only options that block it. Start emacs with minimum customizations. This is like using @samp{-q} and @samp{--no-site-file}, but also disables the startup screen. +@item -daemon +@opindex -daemon +@itemx --daemon +@opindex --daemon +Start emacs in background as a daemon (i.e. it will disconnect from the +terminal), do not open any frames and start the server. Clients can +connect and create graphical or terminal frames using +@code{emacsclient}. + @item --no-splash @opindex --no-splash @vindex inhibit-splash-screen diff --git a/etc/NEWS b/etc/NEWS index 13685fdcb7a..e8bfb7d1754 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -130,6 +130,11 @@ Now, the default behavior is to open a new Emacs frame by default. Use the -c option to get the old behavior of opening files in the currently selected Emacs frame. +*** Emacs can now start in background, as a daemon when using the +--daemon command line argument. It disconnects from the terminal and +starts the server. Clients can connect and create graphical or +terminal frames using emacsclient. + *** The new command close-display-connection closes a connection to a remote display. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a43dd64ed2e..4479267b406 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2008-09-21 Dan Nicolaescu + * startup.el (command-line): Start the server when in daemon mode. + * frame.el (frame-initialize): Remove spurious setting of special-display-function with the default value. diff --git a/lisp/startup.el b/lisp/startup.el index 6c4f2091b1a..5ad00c2f456 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -881,9 +881,15 @@ opening the first frame (e.g. open a connection to an X server).") (run-hooks 'before-init-hook) - ;; Under X Window, this creates the X frame and deletes the terminal frame. - (when (fboundp 'frame-initialize) - (frame-initialize)) + (if (daemonp) + ;; Just start the server here, no need to run + ;; `frame-initialize', it deals with creating a frame and + ;; setting the parameters for the initial frame, we don't need + ;; any oxof those. + (server-start) + ;; Under X Window, this creates the X frame and deletes the terminal frame. + (when (fboundp 'frame-initialize) + (frame-initialize))) ;; Turn off blinking cursor if so specified in X resources. This is here ;; only because all other settings of no-blinking-cursor are here. diff --git a/src/ChangeLog b/src/ChangeLog index 9e855a4898b..97f11fb55bc 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2008-09-21 Dan Nicolaescu + + * emacs.c (standard_args): Add --daemon. + (main): Disconnect from the terminal when --daemon is passed. + (is_daemon): New variable. + (Fdaemonp): New function. + (syms_of_emacs): Defsubr it. + 2008-09-20 Chong Yidong * xdisp.c (get_next_display_element): Handle string display diff --git a/src/emacs.c b/src/emacs.c index 68127df0c06..131662c27a1 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -232,6 +232,9 @@ int noninteractive; int noninteractive1; +/* Nonzero means Emacs was started as a daemon. */ +int is_daemon = 0; + /* Save argv and argc. */ char **initial_argv; int initial_argc; @@ -1068,6 +1071,34 @@ main (int argc, char **argv) exit (0); } +#ifndef DOS_NT + if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)) + { + pid_t f = fork(); + int nfd; + if (f > 0) + exit(0); + if (f < 0) + { + fprintf (stderr, "Cannot fork!\n"); + exit(1); + } + + nfd = open("/dev/null", O_RDWR); + dup2(nfd, 0); + dup2(nfd, 1); + dup2(nfd, 2); + close (nfd); + is_daemon = 1; +#ifdef HAVE_SETSID + setsid(); +#endif + } +#else /* DOS_NT */ + fprintf (stderr, "This platform does not support the -daemon flag.\n"); + exit (1); +#endif /* DOS_NT */ + if (! noninteractive) { #ifdef BSD_PGRPS @@ -1719,6 +1750,7 @@ struct standard_args standard_args[] = { "-nw", "--no-windows", 110, 0 }, { "-batch", "--batch", 100, 0 }, { "-script", "--script", 100, 1 }, + { "-daemon", "--daemon", 99, 0 }, { "-help", "--help", 90, 0 }, { "-no-unibyte", "--no-unibyte", 83, 0 }, { "-multibyte", "--multibyte", 82, 0 }, @@ -2350,6 +2382,13 @@ decode_env_path (evarname, defalt) return Fnreverse (lpath); } +DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0, + doc: /* Make the current emacs process a daemon.*/) + (void) +{ + return is_daemon ? Qt : Qnil; +} + void syms_of_emacs () { @@ -2368,6 +2407,7 @@ syms_of_emacs () defsubr (&Sinvocation_name); defsubr (&Sinvocation_directory); + defsubr (&Sdaemonp); DEFVAR_LISP ("command-line-args", &Vcommand_line_args, doc: /* Args passed by shell to Emacs, as a list of strings.