From 250fce8be5030841cf6e9bb34c0938605592797b Mon Sep 17 00:00:00 2001 From: Andy C Date: Fri, 18 Feb 2022 15:11:56 -0500 Subject: [PATCH] [demo] Verify signal state Fix typo in test/group-session.sh Trying to figure out why we need stop_process_hack() in spec/stateful/harness.py --- demo/cpython/fork_signal_state.py | 71 +++++++++++++++++++ .../{signals.py => keyboard_interrupt.py} | 2 +- test/group-session.sh | 6 +- 3 files changed, 75 insertions(+), 4 deletions(-) create mode 100755 demo/cpython/fork_signal_state.py rename demo/cpython/{signals.py => keyboard_interrupt.py} (91%) diff --git a/demo/cpython/fork_signal_state.py b/demo/cpython/fork_signal_state.py new file mode 100755 index 0000000000..ca61d3caf4 --- /dev/null +++ b/demo/cpython/fork_signal_state.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python2 +""" +fork_signal_state.py +""" +from __future__ import print_function + +import os +import signal +import sys +import time + + +def log(msg, *args): + if args: + msg = msg % args + print(msg, file=sys.stderr) + + +def SignalState(pid): + with open('/proc/%d/status' % pid) as f: + for line in f: + if line.startswith('Sig'): + print(line, end='') + + +def main(argv): + parent_pid = os.getpid() + log('parent is %d', parent_pid) + + # Hm this looks like it works + # Now why doesn't Ctrl-Z through the terminal work? The process group should + # be controlling the terminal + + # test/group-session.sh shows PGID and TPGID (controlling tty process group ID) + + log('===') + SignalState(parent_pid) + signal.signal(signal.SIGTSTP, signal.SIG_IGN) + SignalState(parent_pid) + log('===') + + pid = os.fork() + if pid == 0: + child_pid = os.getpid() + + log('---') + SignalState(child_pid) + signal.signal(signal.SIGTSTP, signal.SIG_DFL) + SignalState(child_pid) + log('---') + + log('sleep 1 in child %d', child_pid) + time.sleep(1) + + elif pid < 0: + raise AssertionError() + + else: + log('parent spawned %d', pid) + + log('waiting') + result = os.waitpid(-1, 0) + log('wait => %s', result) + + +if __name__ == '__main__': + try: + main(sys.argv) + except RuntimeError as e: + print('FATAL: %s' % e, file=sys.stderr) + sys.exit(1) diff --git a/demo/cpython/signals.py b/demo/cpython/keyboard_interrupt.py similarity index 91% rename from demo/cpython/signals.py rename to demo/cpython/keyboard_interrupt.py index 4ce0f5d6a0..afcaa2bfdd 100755 --- a/demo/cpython/signals.py +++ b/demo/cpython/keyboard_interrupt.py @@ -1,6 +1,6 @@ #!/usr/bin/env python2 """ -py_signals.py +keyboard_interrupt.py: How to replace KeyboardInterrupt """ from __future__ import print_function diff --git a/test/group-session.sh b/test/group-session.sh index 2b88a9ad62..93988aec36 100755 --- a/test/group-session.sh +++ b/test/group-session.sh @@ -27,17 +27,17 @@ show_group_session() { case $kind in (*fgproc*) echo '[foreground process]' - ps -o pid,ppid,pgid,sid,tgid,comm + ps -o pid,ppid,pgid,sid,tpgid,comm ;; esac case $kind in (*bgproc*) echo '[background process]' - ps -o pid,ppid,pgid,sid,tgid,comm & + ps -o pid,ppid,pgid,sid,tpgid,comm & wait # - Gets its own PGID - # - Hm UNLIKE bgpipe it also gets its own TGID? Seems consistent in all + # - Hm UNLIKE bgpipe it also gets its own TPGID? Seems consistent in all # shells. Why is that? ;; esac