aboutsummaryrefslogtreecommitdiff
path: root/src/signal/sigtstp_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal/sigtstp_handler.cc')
-rw-r--r--src/signal/sigtstp_handler.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/signal/sigtstp_handler.cc b/src/signal/sigtstp_handler.cc
new file mode 100644
index 0000000..7b32d31
--- /dev/null
+++ b/src/signal/sigtstp_handler.cc
@@ -0,0 +1,32 @@
+#include "signal_handler.h"
+
+#include <errno.h>
+
+namespace ov4
+{
+
+/*
+ * sigtstp_handler - The kernel sends a SIGTSTP to the shell whenever
+ * the user types ctrl-z at the keyboard. Catch it and suspend the
+ * foreground job by sending it a SIGTSTP.
+ */
+void sigtstp_handler([[maybe_unused]] int sig)
+{
+ int errno_backup = errno;
+
+ sigset_t prev;
+ block_handler(&prev);
+
+ int pid = fgpid();
+ if (pid != 0)
+ {
+ kill(-pid, SIGTSTP);
+ }
+
+ sigprocmask(SIG_SETMASK, &prev, nullptr);
+
+ errno = errno_backup;
+ return;
+}
+
+} \ No newline at end of file