mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
This is patch
[ 559250 ] more POSIX signal stuff Adds support (and docs and tests and autoconfery) for posix signal mask handling -- sigpending, sigprocmask and sigsuspend.
This commit is contained in:
parent
e5df1058f1
commit
34f20eac98
8 changed files with 304 additions and 12 deletions
|
@ -1,8 +1,7 @@
|
|||
# Test the signal module
|
||||
from test_support import verbose, TestSkipped
|
||||
from test_support import verbose, TestSkipped, TestFailed
|
||||
import signal
|
||||
import os
|
||||
import sys
|
||||
import os, sys, time
|
||||
|
||||
if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
|
||||
raise TestSkipped, "Can't test signal on %s" % sys.platform
|
||||
|
@ -64,3 +63,66 @@ try:
|
|||
except KeyboardInterrupt:
|
||||
if verbose:
|
||||
print "KeyboardInterrupt (assume the alarm() went off)"
|
||||
|
||||
|
||||
if hasattr(signal, "sigprocmask"):
|
||||
class HupDelivered(Exception):
|
||||
pass
|
||||
def hup(signum, frame):
|
||||
raise HupDelivered
|
||||
def hup2(signum, frame):
|
||||
signal.signal(signal.SIGHUP, hup)
|
||||
return
|
||||
signal.signal(signal.SIGHUP, hup)
|
||||
|
||||
if verbose:
|
||||
print "blocking SIGHUP"
|
||||
|
||||
defaultmask = signal.sigprocmask(signal.SIG_BLOCK, [signal.SIGHUP])
|
||||
|
||||
if verbose:
|
||||
print "sending SIGHUP"
|
||||
|
||||
try:
|
||||
os.kill(pid, signal.SIGHUP)
|
||||
except HupDelivered:
|
||||
raise TestFailed, "HUP not blocked"
|
||||
|
||||
if signal.SIGHUP not in signal.sigpending():
|
||||
raise TestFailed, "HUP not pending"
|
||||
|
||||
if verbose:
|
||||
print "unblocking SIGHUP"
|
||||
|
||||
try:
|
||||
signal.sigprocmask(signal.SIG_UNBLOCK, [signal.SIGHUP])
|
||||
except HupDelivered:
|
||||
pass
|
||||
else:
|
||||
raise TestFailed, "HUP not delivered"
|
||||
|
||||
if verbose:
|
||||
print "testing sigsuspend"
|
||||
|
||||
signal.sigprocmask(signal.SIG_BLOCK, [signal.SIGHUP])
|
||||
signal.signal(signal.SIGHUP, hup2)
|
||||
|
||||
if not os.fork():
|
||||
time.sleep(2)
|
||||
os.kill(pid, signal.SIGHUP)
|
||||
time.sleep(2)
|
||||
os.kill(pid, signal.SIGHUP)
|
||||
os._exit(0)
|
||||
else:
|
||||
try:
|
||||
signal.sigsuspend(defaultmask)
|
||||
except:
|
||||
raise TestFailed, "sigsuspend erroneously raised"
|
||||
|
||||
try:
|
||||
signal.sigsuspend(defaultmask)
|
||||
except HupDelivered:
|
||||
pass
|
||||
else:
|
||||
raise TestFailed, "sigsupsend didn't raise"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue