mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #16105: When a signal handler fails to write to the file descriptor registered with `signal.set_wakeup_fd()
`, report an exception instead of ignoring the error.
This commit is contained in:
parent
f920a1c1f1
commit
6f6ec37838
3 changed files with 62 additions and 1 deletions
|
@ -275,6 +275,47 @@ class WakeupSignalTests(unittest.TestCase):
|
|||
|
||||
assert_python_ok('-c', code)
|
||||
|
||||
def test_wakeup_write_error(self):
|
||||
# Issue #16105: write() errors in the C signal handler should not
|
||||
# pass silently.
|
||||
# Use a subprocess to have only one thread.
|
||||
code = """if 1:
|
||||
import errno
|
||||
import fcntl
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import time
|
||||
from test.support import captured_stderr
|
||||
|
||||
def handler(signum, frame):
|
||||
1/0
|
||||
|
||||
signal.signal(signal.SIGALRM, handler)
|
||||
r, w = os.pipe()
|
||||
flags = fcntl.fcntl(r, fcntl.F_GETFL, 0)
|
||||
fcntl.fcntl(r, fcntl.F_SETFL, flags | os.O_NONBLOCK)
|
||||
|
||||
# Set wakeup_fd a read-only file descriptor to trigger the error
|
||||
signal.set_wakeup_fd(r)
|
||||
try:
|
||||
with captured_stderr() as err:
|
||||
signal.alarm(1)
|
||||
time.sleep(5.0)
|
||||
except ZeroDivisionError:
|
||||
# An ignored exception should have been printed out on stderr
|
||||
err = err.getvalue()
|
||||
if ('Exception ignored when trying to write to the signal wakeup fd'
|
||||
not in err):
|
||||
raise AssertionError(err)
|
||||
if ('OSError: [Errno %d]' % errno.EBADF) not in err:
|
||||
raise AssertionError(err)
|
||||
else:
|
||||
raise AssertionError("ZeroDivisionError not raised")
|
||||
"""
|
||||
|
||||
assert_python_ok('-c', code)
|
||||
|
||||
def test_wakeup_fd_early(self):
|
||||
self.check_wakeup("""def test():
|
||||
import select
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue