summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2010-12-14 14:38:00 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2010-12-14 14:38:00 (GMT)
commite85db2bbb84ba90c03022860f76ca3cdcdf199c6 (patch)
treedb3bd69dee55a3b2b1db47c54ed8a9d7d0a1ebf7 /Lib/test
parent32ef70c827997f869a8d8393e8bde74016b6c8a9 (diff)
downloadcpython-e85db2bbb84ba90c03022860f76ca3cdcdf199c6.zip
cpython-e85db2bbb84ba90c03022860f76ca3cdcdf199c6.tar.gz
cpython-e85db2bbb84ba90c03022860f76ca3cdcdf199c6.tar.bz2
Issue #1731717: Fixed the problem where subprocess.wait() could cause an
OSError exception when The OS had been told to ignore SIGCLD in our process or otherwise not wait for exiting child processes.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/subprocessdata/sigchild_ignore.py6
-rw-r--r--Lib/test/test_subprocess.py10
2 files changed, 16 insertions, 0 deletions
diff --git a/Lib/test/subprocessdata/sigchild_ignore.py b/Lib/test/subprocessdata/sigchild_ignore.py
new file mode 100644
index 0000000..1d03303
--- /dev/null
+++ b/Lib/test/subprocessdata/sigchild_ignore.py
@@ -0,0 +1,6 @@
+import signal, subprocess, sys
+# On Linux this causes os.waitpid to fail with OSError as the OS has already
+# reaped our child process. The wait() passing the OSError on to the caller
+# and causing us to exit with an error is what we are testing against.
+signal.signal(signal.SIGCLD, signal.SIG_IGN)
+subprocess.Popen([sys.executable, '-c', 'print("albatross")']).wait()
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 0804a13..1e97bac 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1073,6 +1073,16 @@ class POSIXProcessTestCase(BaseTestCase):
close_fds=False, pass_fds=(fd, )))
self.assertIn('overriding close_fds', str(context.warning))
+ def test_wait_when_sigchild_ignored(self):
+ # NOTE: sigchild_ignore.py may not be an effective test on all OSes.
+ sigchild_ignore = support.findfile("sigchild_ignore.py",
+ subdir="subprocessdata")
+ p = subprocess.Popen([sys.executable, sigchild_ignore],
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ stdout, stderr = p.communicate()
+ self.assertEqual(0, p.returncode, "sigchild_ignore.py exited"
+ " non-zero with this error:\n%s" % stderr)
+
@unittest.skipUnless(mswindows, "Windows specific tests")
class Win32ProcessTestCase(BaseTestCase):