From f12649c3da8520d32c557aaa80faa4c7320da654 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 12 Mar 2005 16:45:43 +0000 Subject: [PATCH] Write pid file, like a good daemon. Thanks to Daniel O'Connor for the initial patch. (create_pidfile, pidfname): New. (start_server): Create pid file. (finish_server): Remove pid file. (main) [__linux__ && _EMPTH_POSIX]: Don't hack pid into argv[0]. Recent versions of Linux pthreads no longer show multiple PIDs, and deities can get the PID fro the pid file anyway. --- src/server/main.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/server/main.c b/src/server/main.c index c258d063..893ef9ae 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -69,13 +69,14 @@ static void nullify_objects(void); static void init_files(void); static void close_files(void); +static void create_pidfile(char *, pid_t); #if defined(_WIN32) static void loc_NTInit(void); static void loc_NTTerm(void); #endif -static int mainpid = 0; +static char pidfname[] = "server.pid"; /* Debugging? If yes call abort() on internal error. */ int debug = 0; @@ -109,11 +110,6 @@ main(int argc, char **argv) #endif char *config_file = NULL; int op; -#if defined(__linux__) && defined(_EMPTH_POSIX) - s_char tbuf[256]; -#endif - - mainpid = getpid(); #if defined(_WIN32) while ((op = getopt(argc, argv, "D:de:iI:rR:h")) != EOF) { @@ -232,15 +228,6 @@ main(int argc, char **argv) #endif /* !_WIN32 */ start_server(flags); -#if defined(__linux__) && defined(_EMPTH_POSIX) - strcpy(tbuf, argv[0]); - for (op = 1; op < argc; op++) { - strcat(tbuf, " "); - strcat(tbuf, argv[op]); - } - sprintf(argv[0], "%s (main pid: %d)", tbuf, getpid()); -#endif - empth_exit(); CANT_HAPPEN("main thread terminated"); @@ -283,12 +270,15 @@ init_server(void) void start_server(int flags) { + pid_t pid; #if !defined(_WIN32) struct sigaction act; #endif + pid = getpid(); + create_pidfile(pidfname, pid); logerror("------------------------------------------------------"); - logerror("Empire server (pid %d) started", (int)getpid()); + logerror("Empire server (pid %d) started", (int)pid); #if !defined(_WIN32) /* signal() should not be used with mit pthreads. Anyway if u @@ -338,6 +328,19 @@ finish_server(void) #if defined(_WIN32) loc_NTTerm(); #endif + remove(pidfname); +} + +static void +create_pidfile(char *fname, pid_t pid) +{ + FILE *pidf = fopen(fname, "w"); + if (!pidf + || fprintf(pidf, "%d\n", pid) < 0 + || fclose(pidf)) { + logerror("Can't write PID file (%s)", strerror(errno)); + exit(1); + } } static void @@ -471,7 +474,7 @@ shutdwn(int sig) if (sig) logerror("Server shutting down on signal %d", sig); else - logerror("Server shutting down at Deity's request"); + logerror("Server shutting down at deity's request"); finish_server(); #if defined(_WIN32)