Home | History | Annotate | Download | only in test
      1 """This test checks for correct wait4() behavior.
      2 """
      3 
      4 import os
      5 import time
      6 import sys
      7 import unittest
      8 from test.fork_wait import ForkWait
      9 from test.support import reap_children, get_attribute
     10 
     11 # If either of these do not exist, skip this test.
     12 get_attribute(os, 'fork')
     13 get_attribute(os, 'wait4')
     14 
     15 
     16 class Wait4Test(ForkWait):
     17     def wait_impl(self, cpid):
     18         option = os.WNOHANG
     19         if sys.platform.startswith('aix'):
     20             # Issue #11185: wait4 is broken on AIX and will always return 0
     21             # with WNOHANG.
     22             option = 0
     23         deadline = time.monotonic() + 10.0
     24         while time.monotonic() <= deadline:
     25             # wait4() shouldn't hang, but some of the buildbots seem to hang
     26             # in the forking tests.  This is an attempt to fix the problem.
     27             spid, status, rusage = os.wait4(cpid, option)
     28             if spid == cpid:
     29                 break
     30             time.sleep(0.1)
     31         self.assertEqual(spid, cpid)
     32         self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))
     33         self.assertTrue(rusage)
     34 
     35 def tearDownModule():
     36     reap_children()
     37 
     38 if __name__ == "__main__":
     39     unittest.main()
     40