Windows ボックスでは、親プロセスが子プロセスを開始するシナリオがいくつかあります。さまざまな理由で - 親プロセスは子プロセスを中止したいかもしれませんが (これは重要です) 、クリーンアップを許可します- つまり、finally 句を実行します:
try:
res = bookResource()
doStuff(res)
finally:
cleanupResource(res)
(これらはクローザーのようなコンテキストに組み込まれている可能性があります。一般的には、ハードウェアのロック/データベースの状態に関するものです)
問題は、(Linux 環境の場合と同様に) Windows で子にシグナルを送る方法を見つけることができないため、終了する前にクリーンアップを実行することです。これには、子プロセスに何らかの形で例外を発生させる必要があると思います(Ctrl-Cのように)。
私が試したこと:
- os.kill
- os.信号
subprocess.Popen
creationFlags を使用し、ctypes.windll.kernel32.GenerateConsoleCtrlEvent(1, p.pid)
abrt シグナルを使用します。これには、シグナルトラップと洗練されていないループが必要であり、すぐにアボートするのを止めます。ctypes.windll.kernel32.GenerateConsoleCtrlEvent(0, p.pid)
- ctrl-c イベント - 何もしませんでした。
子プロセスがクリーンアップできるように、これを行う確実な方法を誰かが持っていますか?