diff --git a/py/_process/forkedfunc.py b/py/_process/forkedfunc.py index 1c285306..819c3d50 100644 --- a/py/_process/forkedfunc.py +++ b/py/_process/forkedfunc.py @@ -89,12 +89,14 @@ def waitfinish(self, waiter=os.waitpid): exitstatus = 0 signal = systemstatus & 0x7f if not exitstatus and not signal: - retval = self.RETVAL.open('rb') + retvalf = self.RETVAL.open('rb') try: - retval_data = retval.read() + retval_data = retvalf.read() + retval = marshal.loads(retval_data) + except: + retval = None finally: - retval.close() - retval = marshal.loads(retval_data) + retvalf.close() else: retval = None stdout = self.STDOUT.read() diff --git a/testing/process/test_forkedfunc.py b/testing/process/test_forkedfunc.py index ae0d9ab7..7f222108 100644 --- a/testing/process/test_forkedfunc.py +++ b/testing/process/test_forkedfunc.py @@ -34,6 +34,15 @@ def func(): assert not result.out assert not result.err +def test_exit0(): + def exit0(): + os._exit(0) + result = py.process.ForkedFunc(exit0).waitfinish() + assert result.exitstatus == 0 + assert result.signal == 0 + assert not result.out + assert not result.err + def test_execption_in_func(): def fun(): raise ValueError(42)