python

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

66

913 views

forkとexecv

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

  1. # coding: UTF-8
  2. import os
  3. import sys
  4. def main():
  5. os.execv("/bin/ls", ["/bin/ls"])
  6. if __name__ == '__main__':
  7. main()
  8. print("hello")

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

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

  1. # coding: UTF-8
  2. import os
  3. import sys
  4. import time
  5. def main():
  6. child_pid = os.fork()
  7. if child_pid == 0:
  8. # child process
  9. my_pid = os.getpid()
  10. print(f" I am child process.({my_pid})")
  11. os.execv("/bin/ls", ["/bin/ls", "-la"])
  12. print("このメッセージば呼ばれない")
  13. else:
  14. # parent process
  15. my_pid = os.getpid()
  16. print(f"my process id is ({my_pid}).")
  17. print(f"child process id is ({child_pid}).")
  18. if __name__ == '__main__':
  19. main()
  20. print("hello")

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

Page 42 of 69.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

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

ツイッター

@darkimpact0626