开发者

Allowing /sbin/init be SIGSTOPed?

I know /sbin/init has special protection against SIGKILL and SIGSTOP from kernel for obvious reasons.

I have tried telling kernel I want to receive SIGSTOP with ioctl() (similar to SIGABRT and SIGSEGV reqs in main()):

if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) {
    nih_signal_set_handler (SIGSTOP, stop_handler);

but SIGSTOP doesn't arrive to the stop_handler() (from all I know, as nih_error() isn't printed in logs).

In stop_handler(), I'm resetting the SIGSTOP signal handler to SIG_DFL (otherwise it woul开发者_如何学编程d come back to our handler anyways), but this probably leads it being ignored by the kernel again.

How do I tell kernel I want to have init STOPPED?


You'd need to take the SIGNAL_UNKILLABLE flag out of its task struct's signal_struct's flags.

By default (i.e. always on unmodified Linux systems) SIGNAL_UNKILLABLE flag is set on init's signal_struct flags.

You could write a kernel module which would poke init's task struct to change it, then you'd be able to send a stop signal to init.

Sending a stop signal to init is a very bad idea though, as zombies would rapidly proliferate if init wasn't reaping them any more.


Clarification: This is an in-kernel struct and not part of init's source, nor is it accessible or visible from userspace. To change it you'd need to write some kernel code or patch the kernel. It would be fairly trivial, I imagine, to write a kernel module which just hacks it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜