mirror of
https://github.com/python/cpython.git
synced 2025-07-22 18:55:22 +00:00

Instead of assuming that the number process ids of the threads is the same as the process id of the controlling process, use a copy of the dictionary and check for changes in the process ids of the threads from the thread's process ids in the parent process. This makes the test make more sense on systems which assign a new pid to each thread (i.e., Linux). This doesn't fix the other problems evident with this test on Linux.
57 lines
1.1 KiB
Python
57 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
|
|
|
|
NUM_THREADS = 4
|
|
|
|
alive = {}
|
|
|
|
def f(id):
|
|
while 1:
|
|
alive[id] = os.getpid()
|
|
try:
|
|
time.sleep(SHORTSLEEP)
|
|
except IOError:
|
|
pass
|
|
|
|
def main():
|
|
for i in range(NUM_THREADS):
|
|
thread.start_new(f, (i,))
|
|
|
|
time.sleep(LONGSLEEP)
|
|
|
|
a = alive.keys()
|
|
a.sort()
|
|
assert a == range(NUM_THREADS)
|
|
|
|
prefork_lives = alive.copy()
|
|
|
|
cpid = os.fork()
|
|
|
|
if cpid == 0:
|
|
# Child
|
|
time.sleep(LONGSLEEP)
|
|
n = 0
|
|
for key in alive.keys():
|
|
if alive[key] != prefork_lives[key]:
|
|
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()
|