mirror of
https://github.com/openvswitch/ovs
synced 2025-10-13 14:07:02 +00:00
There are conflicting pressures in startup of a daemon process: * The parent process should exit with an error code if the daemon cannot start up successfully. * Some startup actions must be performed in the child process, not in the parent. The most obvious of these are file locking, since child processes do not inherit locks, and anything that requires knowing the child process's PID (e.g. unixctl sockets). Until now, this conflict has usually been handled by giving up part of the first property, i.e. in some cases the parent process would exit successfully and the child immediately afterward exit with a failure code. This commit introduces a better approach, by allowing daemons to perform startup work in the child and only then signal the parent that they have successfully started. If the child instead exits without signaling success, the parent passes this exit code along to its own parent. This commit also modifies the daemons that can usefully take advantage of this new feature to do so.
70 lines
2.3 KiB
C
70 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2008, 2009 Nicira Networks.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef DAEMON_H
|
|
#define DAEMON_H 1
|
|
|
|
#include <limits.h>
|
|
#include <stdbool.h>
|
|
#include <sys/types.h>
|
|
|
|
enum {
|
|
OPT_DETACH = UCHAR_MAX + 2048,
|
|
OPT_NO_CHDIR,
|
|
OPT_OVERWRITE_PIDFILE,
|
|
OPT_PIDFILE,
|
|
};
|
|
|
|
#define DAEMON_LONG_OPTIONS \
|
|
{"detach", no_argument, 0, OPT_DETACH}, \
|
|
{"no-chdir", no_argument, 0, OPT_NO_CHDIR}, \
|
|
{"pidfile", optional_argument, 0, OPT_PIDFILE}, \
|
|
{"overwrite-pidfile", no_argument, 0, OPT_OVERWRITE_PIDFILE}
|
|
|
|
#define DAEMON_OPTION_HANDLERS \
|
|
case OPT_DETACH: \
|
|
set_detach(); \
|
|
break; \
|
|
\
|
|
case OPT_NO_CHDIR: \
|
|
set_no_chdir(); \
|
|
break; \
|
|
\
|
|
case OPT_PIDFILE: \
|
|
set_pidfile(optarg); \
|
|
break; \
|
|
\
|
|
case OPT_OVERWRITE_PIDFILE: \
|
|
ignore_existing_pidfile(); \
|
|
break;
|
|
|
|
char *make_pidfile_name(const char *name);
|
|
void set_pidfile(const char *name);
|
|
const char *get_pidfile(void);
|
|
void set_no_chdir(void);
|
|
bool is_chdir_enabled(void);
|
|
void set_detach(void);
|
|
bool get_detach(void);
|
|
void daemonize(void);
|
|
void daemonize_start(void);
|
|
void daemonize_complete(void);
|
|
void die_if_already_running(void);
|
|
void ignore_existing_pidfile(void);
|
|
void daemon_usage(void);
|
|
pid_t read_pidfile(const char *name);
|
|
|
|
#endif /* daemon.h */
|