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.
This commit is contained in:
parent
3f472fc729
commit
f12649c3da
1 changed files with 20 additions and 17 deletions
|
@ -69,13 +69,14 @@
|
||||||
static void nullify_objects(void);
|
static void nullify_objects(void);
|
||||||
static void init_files(void);
|
static void init_files(void);
|
||||||
static void close_files(void);
|
static void close_files(void);
|
||||||
|
static void create_pidfile(char *, pid_t);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
static void loc_NTInit(void);
|
static void loc_NTInit(void);
|
||||||
static void loc_NTTerm(void);
|
static void loc_NTTerm(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int mainpid = 0;
|
static char pidfname[] = "server.pid";
|
||||||
|
|
||||||
/* Debugging? If yes call abort() on internal error. */
|
/* Debugging? If yes call abort() on internal error. */
|
||||||
int debug = 0;
|
int debug = 0;
|
||||||
|
@ -109,11 +110,6 @@ main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
char *config_file = NULL;
|
char *config_file = NULL;
|
||||||
int op;
|
int op;
|
||||||
#if defined(__linux__) && defined(_EMPTH_POSIX)
|
|
||||||
s_char tbuf[256];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mainpid = getpid();
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
while ((op = getopt(argc, argv, "D:de:iI:rR:h")) != EOF) {
|
while ((op = getopt(argc, argv, "D:de:iI:rR:h")) != EOF) {
|
||||||
|
@ -232,15 +228,6 @@ main(int argc, char **argv)
|
||||||
#endif /* !_WIN32 */
|
#endif /* !_WIN32 */
|
||||||
start_server(flags);
|
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();
|
empth_exit();
|
||||||
|
|
||||||
CANT_HAPPEN("main thread terminated");
|
CANT_HAPPEN("main thread terminated");
|
||||||
|
@ -283,12 +270,15 @@ init_server(void)
|
||||||
void
|
void
|
||||||
start_server(int flags)
|
start_server(int flags)
|
||||||
{
|
{
|
||||||
|
pid_t pid;
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pid = getpid();
|
||||||
|
create_pidfile(pidfname, pid);
|
||||||
logerror("------------------------------------------------------");
|
logerror("------------------------------------------------------");
|
||||||
logerror("Empire server (pid %d) started", (int)getpid());
|
logerror("Empire server (pid %d) started", (int)pid);
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
/* signal() should not be used with mit pthreads. Anyway if u
|
/* signal() should not be used with mit pthreads. Anyway if u
|
||||||
|
@ -338,6 +328,19 @@ finish_server(void)
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
loc_NTTerm();
|
loc_NTTerm();
|
||||||
#endif
|
#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
|
static void
|
||||||
|
@ -471,7 +474,7 @@ shutdwn(int sig)
|
||||||
if (sig)
|
if (sig)
|
||||||
logerror("Server shutting down on signal %d", sig);
|
logerror("Server shutting down on signal %d", sig);
|
||||||
else
|
else
|
||||||
logerror("Server shutting down at Deity's request");
|
logerror("Server shutting down at deity's request");
|
||||||
finish_server();
|
finish_server();
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue