python

しょっちゅう忘れることを書いておく。

33

482 views

forkとexecv

forkはプロセスをコピーするもの、execvはプロセスを別のコマンドに置き換えるというもの。
じゃあ、forkを実行せず、execvだけ実行したらどうなるか、という実験。

# coding: UTF-8
import os
import sys


def main():
    os.execv("/bin/ls", ["/bin/ls"])


if __name__ == '__main__':
    main()
    print("hello")

12行目のhelloが表示されるかどうかが肝。
答えはhelloは表示されず、lsの結果だけが表示される。
つまり、os.execvが実行された時点で/bin/lsのプロセスに置き換わっていると言え、そのため後から呼ばれるhelloは表示されない。

普通は子プロセスがforkされたら、execvで別のプロセスに置き換えるのが定石。

# coding: UTF-8
import os
import sys
import time

def main():
    child_pid = os.fork()
    if child_pid == 0:
        # child process
        my_pid = os.getpid()
        print(f" I am child process.({my_pid})")
        os.execv("/bin/ls", ["/bin/ls", "-la"])
        print("このメッセージば呼ばれない")
    else:
        # parent process
        my_pid = os.getpid()
        print(f"my process id is ({my_pid}).")
        print(f"child process id is ({child_pid}).")


if __name__ == '__main__':
    main()
    print("hello")

たまーに、15行目以降にexecvを呼び出しているサンプルを見るが、それをやると親プロセスが別のプロセスに変身してしまうのでおかしい。

Page 42 of 56.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626