mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +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()
 |