1

/sbin/initには、明らかな理由から、カーネルSIGKILLに対して特別な保護があることを知っています。SIGSTOP

SIGSTOP受信したいカーネルに伝えようとしました( main()のreqsとioctl()同様):SIGABRTSIGSEGV

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

しかし、SIGSTOPに到着しません(ログに出力されていないstop_handler()ため、私が知っている限りでは)。nih_error()

では、シグナル ハンドラーを にstop_handler()リセットしています (そうしないと、シグナル ハンドラーに戻ってしまいます)。SIGSTOPSIG_DFL

init STOPPED をカーネルに伝えるにはどうすればよいですか?

4

1 に答える 1

2

タスク構造体の signal_struct のフラグから SIGNAL_UNKILLABLE フラグを削除する必要があります。

デフォルトでは (つまり、変更されていない Linux システムでは常に)、init の signal_struct フラグに SIGNAL_UNKILLABLE フラグが設定されています。

init のタスク構造体を突いて変更するカーネル モジュールを作成すると、init に停止信号を送信できます。

ただし、init に停止信号を送るのは非常に悪い考えです。init がゾンビを刈り取らないとゾンビが急速に増殖するからです。


明確化: これはカーネル内の構造体であり、init のソースの一部ではなく、ユーザー空間からアクセスまたは可視化することもできません。これを変更するには、カーネル コードを記述するか、カーネルにパッチを適用する必要があります。ハッキングするだけのカーネルモジュールを書くのは、かなり簡単だと思います。

于 2010-11-10T15:24:45.833 に答える