#!./python import sys, os, time, threading # a thread, which waits for the main program to terminate def joiningfunc(mainthread): print >>sys.stderr, "XX joining func calling mainthread.join()." time.sleep(1) mainthread.join() time.sleep(1) print >>sys.stderr, "XX end of joining func." print 'end of thread' main_thread = threading.current_thread() def worker(): print >>sys.stderr, "XX before fork!" time.sleep(1) childpid = os.fork() print >>sys.stderr, "XX after fork!", childpid time.sleep(1) if childpid != 0: print >>sys.stderr, "XX parent calling waitpid(", childpid, ")" os.waitpid(childpid, 0) print >>sys.stderr, "XX parent waitpid done, calling exit" sys.exit(0) time.sleep(1) t = threading.Thread(target=joiningfunc, args=(main_thread,)) print 'end of main' print >>sys.stderr, "XX starting joiningfunc thread" time.sleep(1) t.start() print >>sys.stderr, "XX joiningfunc thread started, joining on it." time.sleep(1) t.join() # Should not block: main_thread is already stopped print >>sys.stderr, "XX joined on joiningfunc thread. worker done" w = threading.Thread(target=worker) print >>sys.stderr, "XX starting another thread." w.start() print >>sys.stderr, "XX thread started."