しょっちゅう忘れることを書いておく。
![]() |
66 |
844 views
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 69.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/