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 の上にライブラリ関数の層がある(例:
printf→writesyscall)。
典型パターン(トレーサ): 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]]も参照。