このBlogは移転しました。今後は aish.dev を御覧ください。

Pythonで学ぶ「詳解 UNIXプログラミング」(その9) 第9章 プロセスの関係

9.1 オーファンドプロセスグループの作成

import sys, os, time, signal, traceback

def pr_ids(name):
    print "{0} pid={1} ppid={2} pgrp={3}".format(
        name, os.getpid(), os.getppid(), os.getpgrp())

def sig_hup(signum, frame):
    print "SIGHUP received, pid={0}".format(os.getpid())
    
pr_ids("parent")

pid = os.fork()
if pid:  # parent
    time.sleep(5)
    print "parent finish"
    sys.exit(0)
else:    # child
    pr_ids("child")
    signal.signal(signal.SIGHUP, sig_hup)

    os.kill(os.getpid(), signal.SIGSTOP)

    pr_ids("child")
    time.sleep(1)

    try:
        os.read(0, 1)
    except:
        traceback.print_exc()

手元の環境では、os.read()の前にtime.sleep()を入れないと解説通りの動作とはならず、普通に端末からの読み込み待ちとなった。time.sleep()なしだと、オーファンドバックグラウンドプロセスグループに移行する前に端末からの読み込みを開始してしまうのだろう。