chiark / gitweb /
manager: Do not handle SIGKILL since we can not
authorChengwei Yang <chengwei.yang@intel.com>
Mon, 20 May 2013 07:22:27 +0000 (15:22 +0800)
committerLennart Poettering <lennart@poettering.net>
Thu, 6 Jun 2013 06:58:58 +0000 (08:58 +0200)
This is a minor fix because it's not a major issue, this fix just avoid
to get EINVAL error from sigaction(2).

There are two signals can not handled at user space, SIGKILL and
SIGSTOP even we're PID 1, trying to handle these two signals will get
EINVAL error.

There are two kinds of systemd instance, running as system manager or
user session manager, apparently, the latter is a general user space
process which can not handle SIGKILL. The special pid 1 also can not
do that refer to kernel/signal.c:do_sigaction().

However, pid 1 is unkillable because the kernel did attach
SIGNAL_UNKILLABLE to it at system boot up, refer to
init/main.c:start_kernel()
    --> rest_init()
        --> kernel_thread()
            --> kernel_init()
                --> init_post()
                    current->signal->flags |= SIGNAL_UNKILLABLE

src/core/main.c
src/shared/def.h

index bb7364054e3942224f1424720be3231a33de91b7..26aa561218f3f801a27451dc96b1f3c1f92285c3 100644 (file)
@@ -1405,7 +1405,6 @@ int main(int argc, char *argv[]) {
         /* Reset all signal handlers. */
         assert_se(reset_all_signal_handlers() == 0);
 
-        /* If we are init, we can block sigkill. Yay. */
         ignore_signals(SIGNALS_IGNORE, -1);
 
         if (parse_config_file() < 0)
index 5ba170f96581e3611f9157937c3d49d4603cf804..5abb544247542831927783613e345de53598a1dc 100644 (file)
@@ -32,4 +32,4 @@
 #define SYSTEMD_CGROUP_CONTROLLER "name=systemd"
 
 #define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
-#define SIGNALS_IGNORE SIGKILL,SIGPIPE
+#define SIGNALS_IGNORE SIGPIPE