def test_sigwait(self): import _signal as signal def handler(signum, frame): 1 / 0 signal.signal(signal.SIGALRM, handler) signal.alarm(1) received = signal.sigwait([signal.SIGALRM]) assert received == signal.SIGALRM
def test_pthread_kill(self): import _signal as signal import _thread signum = signal.SIGUSR1 def handler(signum, frame): 1 / 0 signal.signal(signum, handler) tid = _thread.get_ident() raises(ZeroDivisionError, signal.pthread_kill, tid, signum)
def test_itimer_real(self): import _signal as signal def sig_alrm(*args): self.called = True signal.signal(signal.SIGALRM, sig_alrm) old = signal.setitimer(signal.ITIMER_REAL, 1.0) assert old == (0, 0) val, interval = signal.getitimer(signal.ITIMER_REAL) assert val <= 1.0 assert interval == 0.0 signal.pause() assert self.called
def test_sigmask(self): import _signal as signal, posix signum1 = signal.SIGUSR1 signum2 = signal.SIGUSR2 def handler(signum, frame): pass signal.signal(signum1, handler) signal.signal(signum2, handler) signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2)) posix.kill(posix.getpid(), signum1) posix.kill(posix.getpid(), signum2) assert signal.sigpending() == set((signum1, signum2)) # Unblocking the 2 signals calls the C signal handler twice signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2)) assert signal.sigpending() == set()
def test_set_wakeup_fd(self): try: import _signal as signal, posix, fcntl except ImportError: skip('cannot import posix or fcntl') def myhandler(signum, frame): pass signal.signal(signal.SIGINT, myhandler) # def cannot_read(): try: posix.read(fd_read, 1) except OSError: pass else: raise AssertionError("os.read(fd_read, 1) succeeded?") # fd_read, fd_write = posix.pipe() flags = fcntl.fcntl(fd_write, fcntl.F_GETFL, 0) flags = flags | posix.O_NONBLOCK fcntl.fcntl(fd_write, fcntl.F_SETFL, flags) flags = fcntl.fcntl(fd_read, fcntl.F_GETFL, 0) flags = flags | posix.O_NONBLOCK fcntl.fcntl(fd_read, fcntl.F_SETFL, flags) # old_wakeup = signal.set_wakeup_fd(fd_write) try: cannot_read() posix.kill(posix.getpid(), signal.SIGINT) res = posix.read(fd_read, 1) assert res == bytes([signal.SIGINT]) cannot_read() finally: old_wakeup = signal.set_wakeup_fd(old_wakeup) # signal.signal(signal.SIGINT, signal.SIG_DFL)
def test_siginterrupt(self): import _signal as signal, os, time if not hasattr(signal, 'siginterrupt'): skip('non siginterrupt in signal') signum = signal.SIGUSR1 def readpipe_is_not_interrupted(): # from CPython's test_signal.readpipe_interrupted() r, w = os.pipe() ppid = os.getpid() pid = os.fork() if pid == 0: try: time.sleep(1) os.kill(ppid, signum) time.sleep(1) finally: os._exit(0) else: try: os.close(w) # we expect not to be interrupted. If we are, the # following line raises OSError(EINTR). os.read(r, 1) finally: os.waitpid(pid, 0) os.close(r) # oldhandler = signal.signal(signum, lambda x, y: None) try: signal.siginterrupt(signum, 0) readpipe_is_not_interrupted() readpipe_is_not_interrupted() finally: signal.signal(signum, oldhandler)