diff Lib/test/test_fork1.py @ 11855:79ea19085fb6 legacy-trunk

Test case for fork1() behavior. Only the main thread should survive in the child after a fork().
author Guido van Rossum <guido@python.org>
date Fri, 25 Feb 2000 19:25:05 +0000
parents
children 6b4667fa4938
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/test/test_fork1.py	Fri Feb 25 19:25:05 2000 +0000
@@ -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()