ptrace ベースのトレーサ/デバッガ([[concepts/ptrace-syscall-tracing]])を作る土台となる、UNIX プロセス・シグナルの基礎。『ptrace入門』(Yoshihiro Oyama)第1章から抽出。

プロセス生成と置換

  • fork: プロセスを複製。返り値で分岐する(子は 0、親は子の pid > 0)。getpid()/getppid()
  • clone: fork より細かく引き継ぎ(アドレス空間・FD 等)を制御できる。スレッド生成の基盤。
  • execve: 現プロセス上で新しいプログラムをロードして実行。成功すると戻ってこない(失敗時のみ続行)。新プロセスにはならず、イメージが置換される。CTF の任意コード実行でも使う。exec 系 wrapper: execl/execlp/execle
  • wait: 親が子の状態変化(停止/終了)に同期する。
  • syscall の上にライブラリ関数の層がある(例: printfwrite syscall)。

典型パターン(トレーサ): fork → 子が PTRACE_TRACEME → 子が execve → 子が syscall で SIGTRAP 停止 → 親が wait → 親が reg/mem を r/w → 親が再開。

シグナル

プロセスに送られる非同期の信号。kill syscall で送る(例 kill(2384, SIGSTOP))。SEGV 時は OS が SIGSEGV を送る。他ユーザのプロセスには送れない(operation not permitted)。

主要シグナル:

  • SIGINT = 2(^C)、SIGTERM(終了要求、ハンドラ変更可)。
  • SIGKILL = 9: 強制終了。ハンドラ変更/捕捉不可(全ハンドラを潰しても KILL では止められる)。
  • SIGSTOP: 停止、ハンドラ変更不可。SIGTSTP: 端末由来の一時停止、変更可。SIGCONT: 再開。
  • SIGTRAP: トレースイベントによる実行中断。ptrace/デバッガの中核。

シグナルハンドラ

  • sigaction でハンドラを差し替える。デフォルト処理がある。
  • async-signal-safe: ハンドラから安全に呼べる関数は限られる。ハンドラ内での I/O や longjmp は原則 NG(signal-safety(7))。再入可能性の問題。

ps の STAT

S=sleep, t=デバッガにより停止(T stopped), Z=zombie(親と切れた)。トレース中の子は t で観測できる。

関連

  • これらを使って syscall をトレース/サンドボックス/デバッグするのが [[concepts/ptrace-syscall-tracing]]
  • 現代的代替は [[entities/redox-slab-allocator]] 文脈の話ではなく eBPF。[[concepts/inter-process-communication]] も参照。