summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_fork1.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_fork1.py')
-rw-r--r--Lib/test/test_fork1.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py
new file mode 100644
index 0000000..361664e
--- /dev/null
+++ b/Lib/test/test_fork1.py
@@ -0,0 +1,54 @@
+"""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()