Slide 1

Slide 1 text

プロセスの生成 exec編 Dec. 29th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

exec関数とは ● Linuxで新しいプログラムを実行する関数 ● forkと似て非なるもの ○ fork: プロセスを複製して新しいプロセスを作成する ○ exec: 同じプロセス上で新しいプログラムを実行する 2

Slide 3

Slide 3 text

exec(): CPU上で動作する処理の観点 1. CPU上で動くプロセスがexec()を呼ぶ 2. exec()後にプロセスはexecで指定したプログラムを実行する 3 CPU exec()呼び出し exec()から復帰 プロセス (プログラムA) カーネル プロセス (プログラムB)

Slide 4

Slide 4 text

exec: 物理メモリの観点 4 プロセスの メモリ (プログラムA) (1)  exec()呼び出し時 カーネルの メモリ プロセスの メモリ (プログラムA) カーネルの メモリ プロセスの メモリ (プログラムB) カーネルの メモリ CPU上で 実行中のコード (2) カーネルによるexec()の処理 (3) exec()復帰後 CPU上で 実行中のコード CPU上で 実行中のコード (プログラムBの エントリポイント) プロセスの メモリ (プログラムB) 新規割り当て 後で解放

Slide 5

Slide 5 text

コード #!/usr/bin/python3 import os print(f"プログラムA(exec前): pid={os.getpid()}") os.execve("./b.py", ["b.py"],{}) print("この業は実行されないはず") 5 プログラムA(a.py) プログラムB(b.py) #!/usr/bin/python3 import os print(f"プログラムB(exec後): pid={os.getpid()}")

Slide 6

Slide 6 text

実行結果 ● プログラムAをするとexec呼び出しによってプログラムBが実行される ● execの後のprint()文は実行されない ● execによってpidは変わらない 6 $ ./a.py プログラムA(exec前): pid=135225 プログラムB(exec後): pid=135225

Slide 7

Slide 7 text

まとめ ● 新しいプログラムを実行する際はexec関数を呼び出す ● forkと似て非なるもの ○ fork: プロセスを複製して新しいプロセスを作成する ○ exec: 同じプロセス上で新しいプログラムを実行する ● 📝 ひとくちにexecといっても“man 3 exec”を見るとexecl,execlp…など似たような ものがたくさんあるが、全部ただの変種なので気にしなくていい 7