mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""This test checks for correct fork() behavior.
 | 
						|
 | 
						|
We want fork1() semantics -- only the forking thread survives in the
 | 
						|
child after a fork().
 | 
						|
 | 
						|
On some systems (e.g. Solaris without posix threads) we find that all
 | 
						|
active threads survive in the child after a fork(); this is an error.
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
import os, sys, time, thread
 | 
						|
 | 
						|
LONGSLEEP = 2
 | 
						|
 | 
						|
SHORTSLEEP = 0.5
 | 
						|
 | 
						|
alive = {}
 | 
						|
 | 
						|
def f(id):
 | 
						|
    while 1:
 | 
						|
        alive[id] = os.getpid()
 | 
						|
        try:
 | 
						|
            time.sleep(SHORTSLEEP)
 | 
						|
        except IOError:
 | 
						|
            pass
 | 
						|
 | 
						|
def main():
 | 
						|
    for i in range(4):
 | 
						|
        thread.start_new(f, (i,))
 | 
						|
 | 
						|
    time.sleep(LONGSLEEP)
 | 
						|
 | 
						|
    a = alive.keys()
 | 
						|
    a.sort()
 | 
						|
    assert a == range(4)
 | 
						|
 | 
						|
    cpid = os.fork()
 | 
						|
 | 
						|
    if cpid == 0:
 | 
						|
        # Child
 | 
						|
        time.sleep(LONGSLEEP)
 | 
						|
        n = 0
 | 
						|
        pid = os.getpid()
 | 
						|
        for key in alive.keys():
 | 
						|
            if alive[key] == pid:
 | 
						|
                n = n+1
 | 
						|
        os._exit(n)
 | 
						|
    else:
 | 
						|
        # Parent
 | 
						|
        spid, status = os.waitpid(cpid, 0)
 | 
						|
        assert spid == cpid
 | 
						|
        assert status == 0, "cause = %d, exit = %d" % (status&0xff, status>>8)
 | 
						|
 | 
						|
main()
 |