
新Linux入門|親プロセスと子プロセスの関係と動作のしくみ
Linuxの世界では、すべての動作が「プロセス」という単位で管理されています。
その中でも大事なのが、「親プロセス」と「子プロセス」の関係です。
この記事では、親子関係がどのように形成されるのか、
そしてどのように協調して動作しているのかをわかりやすく説明します💡

🧩 親プロセスと子プロセスの概要
プロセスとは、実行中のプログラムのインスタンスで、
それぞれが 一意のプロセスID(PID) を持っています。
親プロセス(Parent Process)は、新しいプロセスを生成する元となるプロセスで、
生成された側は 子プロセス(Child Process) と呼ばれます。
| 用語 | 説明 |
|---|---|
| 親プロセス | 新しいプロセスを生成した元のプロセス |
| 子プロセス | 親プロセスから派生した新しいプロセス |
| PID | プロセスID。各プロセスを一意に識別する番号 |
| PPID | 親プロセスのPID(Parent Process ID) |
💬ポイント
Linuxでは、すべてのプロセスが階層的に連なっており、
最初に起動される systemd(PID=1) がすべての親の「祖先」にあたります。
⚙️ プロセスの生成と階層構造
新しいプロセスは、既存のプロセスが forkシステムコール を実行することで作られます。
fork() は、親プロセスのコピーを作成し、それを独立した子プロセスとして動かします。
| 項目 | 説明 |
|---|---|
| fork() | 親プロセスをコピーして新しい子プロセスを作るシステムコール |
| exec() | 子プロセス内で新しいプログラムを実行するシステムコール |
| wait() | 親プロセスが子プロセスの終了を待機するシステムコール |
🧠 イメージ的には、
「fork() で子を作り、exec() で子に別のプログラムを実行させる」
という流れになります。
🧬 親子プロセスの関係(PIDとPPID)
親と子の関係は、PID(プロセスID)とPPID(親プロセスID)で確認できます。
使用コマンド:ps
[suzuki@AlmaLinux ~]$ ps -ef | grep bash
root 1 0 0 09:00 ? 00:00:02 systemd
suzuki 2170 2100 0 10:12 pts/0 00:00:00 bash
suzuki 2245 2170 0 10:13 pts/0 00:00:00 sleep 60| 列 | 意味 |
|---|---|
| PID | プロセスID(各プロセス固有の番号) |
| PPID | 親プロセスID(親のPID) |
| CMD | 実行中のコマンド |
💬ポイント
この例では、
bash (PID=2170) が親であり、
その子プロセスとして sleep 60 (PID=2245) が存在しています。
🧭 親プロセスが終了したときの動作
通常、子プロセスは親プロセスと独立して動作しますが、
もし親プロセスが先に終了すると、その子プロセスは「孤児プロセス(orphan process)」になります。
孤児となったプロセスは、自動的に systemd(PID=1) に引き取られます。
これにより、システム全体の整合性が保たれるようになっています。
| 状況 | 動作 |
|---|---|
| 親プロセスが生存中 | 子プロセスを監視・終了待ちが可能 |
| 親プロセスが終了 | 子プロセスは systemd の子になる |
| 子プロセスが終了 | 親プロセスにシグナル(SIGCHLD)が送信される |
💬ポイント
この仕組みにより、どんな状況でもプロセスツリーが途切れず、
システムが安定して動作します。
🔄 プロセス間の相互作用
親と子は、お互いに情報をやり取りしたり制御したりすることができます。
主な方法は次の2つです👇
| メカニズム | 説明 |
|---|---|
| シグナル(signal) | 親→子、または子→親に通知を送る仕組み(例:killコマンド) |
| パイプ(pipe) | 親子間でデータを受け渡す通信路を作る仕組み |
シグナル送信の例
[suzuki@AlmaLinux ~]$ kill -SIGSTOP 2245 # 子プロセスを停止
[suzuki@AlmaLinux ~]$ kill -SIGCONT 2245 # 子プロセスを再開パイプ通信の例
[suzuki@AlmaLinux ~]$ ls | grep log💬ポイント
この場合、ls プロセスの出力が grep プロセスの入力へと渡されます。
2つの子プロセスがパイプで繋がることで、柔軟な処理が実現できるんですね✨
🧱 実例:シェルの親子プロセス構造
ユーザーがシェルでコマンドを入力すると、そのたびにシェルは新しい子プロセスを生成します。
例
[suzuki@AlmaLinux ~]$ ps -ef --forest出力例
root 1 0 0 09:00 ? 00:00:02 systemd
├─sshd 1192 1 0 09:02 ? 00:00:00 sshd: suzuki@pts/0
│ └─bash 2170 1192 0 10:12 pts/0 00:00:00 -bash
│ └─sleep 2245 2170 0 10:13 pts/0 00:00:00 sleep 60💬ポイント
このように、ツリー構造(プロセスツリー)で親子関係を視覚的に確認できます。
systemd → sshd → bash → sleep と階層的につながっていることが分かりますね。
🧰 よく使うプロセス関連コマンド
| コマンド | 説明 | 主なオプション |
|---|---|---|
| ps | 実行中のプロセスを一覧表示 | -ef(全体表示), --forest(ツリー構造表示) |
| pstree | プロセスの親子関係をツリー形式で表示 | -p(PID付きで表示) |
| kill | プロセスにシグナルを送る | -9(強制終了), -l(シグナル一覧) |
| top | プロセスの動作状況をリアルタイムで表示 | -u ユーザー名(特定ユーザーのプロセスのみ) |
🌈 まとめ
- 親プロセスは、forkを使って新しい子プロセスを生成する。
- 子プロセスは親とは独立して実行されるが、PIDとPPIDで関係づけられている。
- 親が終了すると、子は自動的に systemd の子プロセスになる。
- シグナルやパイプを使うことで、親子間の通信や制御が可能。
Linuxのプロセス管理は、「親と子のつながり」で成り立っています👨👩👧👦
この関係を理解することで、システムの仕組みがより深く見えてきますよ✨
