Pythonバージョン: 3.5.2

以下のようにサブプロセスを呼び出し、terminate()でサブプロセスを終了させるとします。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess
import shlex
import time


def main():
    p = subprocess.Popen(shlex.split('python3 child.py'),
                         shell=False)

    time.sleep(3)
    p.terminate()


if __name__ == '__main__':
    main()

サブプロセス側ではSIGTERMハンドラを登録しておくと、LinuxではSIGTERMハンドラが呼び出されますが、Windowsでは呼び出されません。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess
import signal
import shlex
import time

def main():
    def sigterm_handler(signum, frame):
        print('Child Catch SIGTERM')
        raise KeyboardInterrupt('SIGTERM!!')

    signal.signal(signal.SIGTERM, sigterm_handler)

    try:
        while True:
            print('Hello child')
            time.sleep(1)
    except KeyboardInterrupt:
        print('KeyboardInterrupt!!')


if __name__ == '__main__':
    main()

ようはterminate()で終了させる時に、サブプロセス側で終了処理を行いたいのですが、何か方法はないでしょうか?atexitも試してみましたが呼び出されませんでした。

公式のドキュメントを見ると、
https://docs.python.jp/3/library/subprocess.html
Windowsではシグナルではなく、TerminateProcess()で終了されるとのことなので、TerminateProcess()をフックする必要がありそうです。こちらで調べている限りでは、少なくとも正攻法ではフックすることができないように思えます。