import os import sys import errno import select from signal import signal, SIGCHLD from optparse import OptionParser from functools import partial def main(argv): options, args = parse_args(sys.argv[1:]) if options.set_handler: signal(options.signal_number, handler) if options.until_concludes: _select = lambda *a: until_concludes(select.select, *a) else: _select = select.select print('%d blocking, kill() me' % (os.getpid(),)) try: _select([], [], []) print('select returned') except KeyboardInterrupt: print('Ctrl-C caught') def until_concludes(f, *a, **kw): while True: try: return f(*a, **kw) except (IOError, OSError, select.error) as e: if e.args[0] == errno.EINTR: continue raise def handler(sig, frame): print('%d interrups at %s' % (sig, frame,)) def parse_args(args): parser = OptionParser() parser.add_option("--until-concludes", action="store_true", default=False) parser.add_option("--set-handler", action="store_true", default=False) parser.add_option("--signal-number", type="int", default=SIGCHLD) return parser.parse_args(args=args) if __name__ == '__main__': main(sys.argv)