aboutsummaryrefslogtreecommitdiff
path: root/src/signal
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal')
-rw-r--r--src/signal/handler.cc32
-rw-r--r--src/signal/sigchld_handler.cc41
-rw-r--r--src/signal/signal_status.cc22
3 files changed, 77 insertions, 18 deletions
diff --git a/src/signal/handler.cc b/src/signal/handler.cc
new file mode 100644
index 0000000..294ae53
--- /dev/null
+++ b/src/signal/handler.cc
@@ -0,0 +1,32 @@
+#include "signal_handler.h"
+
+#include <print>
+#include <signal.h>
+#include <cstdio>
+
+using namespace std;
+
+namespace ov4
+{
+
+void process_signal()
+{
+ /*
+ * do NOT swap these statements
+ * otherwise, if process then unset flag, and another signal delivered
+ * it won't be processed
+ */
+ if (check_signal_delivered(SIGCHLD))
+ {
+ unset_signal_delivered(SIGCHLD);
+ process_sigchld();
+ }
+}
+
+void process_sigchld()
+{
+ print("hi\r\n");
+ fflush(stdout);
+}
+
+} \ No newline at end of file
diff --git a/src/signal/sigchld_handler.cc b/src/signal/sigchld_handler.cc
index e11ed26..c1a7740 100644
--- a/src/signal/sigchld_handler.cc
+++ b/src/signal/sigchld_handler.cc
@@ -2,6 +2,8 @@
#include <errno.h>
+#include "pipe.h"
+
namespace ov4
{
@@ -24,24 +26,27 @@ void sigchld_handler([[maybe_unused]] int sig)
while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0)
{
+ set_signal_delivered(SIGCHLD);
+ self_pipe_write();
+ //safe_print("-----------");
// signal'd or stopped or normally quit
// print terminated/stopped message
if (WIFSIGNALED(status) || WIFSTOPPED(status))
{
int jid = pid2jid(pid);
- safe_output("Job [", jid, "] (", pid, ") ");
- if (!WIFSTOPPED(status) && WTERMSIG(status) == SIGINT)
- safe_print("terminated");
- else if (WIFSTOPPED(status))
- safe_print("stopped");
- else
- safe_print("idk");
- safe_print(" by signal ");
- if (WIFSTOPPED(status))
- safe_print(WSTOPSIG(status));
- else
- safe_print(WTERMSIG(status));
- safe_print("\n");
+ //safe_output("Job [", jid, "] (", pid, ") ");
+ // if (!WIFSTOPPED(status) && WTERMSIG(status) == SIGINT)
+ // //safe_print("terminated");
+ // else if (WIFSTOPPED(status))
+ // //safe_print("stopped");
+ // else
+ // //safe_print("idk");
+ // //safe_print(" by signal ");
+ // if (WIFSTOPPED(status))
+ // //safe_print(WSTOPSIG(status));
+ // else
+ // //safe_print(WTERMSIG(status));
+ // //safe_print("\n");
}
// handle job table
@@ -50,7 +55,7 @@ void sigchld_handler([[maybe_unused]] int sig)
// stopped
if (WIFSTOPPED(status))
{
- safe_output("Process suspended PID: ", pid, "\n");
+ //safe_output("Process suspended PID: ", pid, "\n");
sigset_t prev_inner;
block_all(&prev_inner);
job_suspend(pid);
@@ -59,7 +64,7 @@ void sigchld_handler([[maybe_unused]] int sig)
// other type of signal'd
// or normally quit
else {
- safe_output("Process terminated PID: ", pid, "\n");
+ //safe_output("Process terminated PID: ", pid, "\n");
sigset_t prev_inner;
block_all(&prev_inner);
deletejob(pid);
@@ -69,7 +74,7 @@ void sigchld_handler([[maybe_unused]] int sig)
// so that exit code should be available
if (WIFEXITED(status))
{
- safe_output("Exit code: ", WEXITSTATUS(status), "\n");
+ //safe_output("Exit code: ", WEXITSTATUS(status), "\n");
if (pid == exit_required_pid)
{
exit_code = WEXITSTATUS(status);
@@ -79,11 +84,11 @@ void sigchld_handler([[maybe_unused]] int sig)
// if signal'd
else if (WIFSIGNALED(status))
{
- safe_output("Signal code: ", WTERMSIG(status), "\n");
+ //safe_output("Signal code: ", WTERMSIG(status), "\n");
if (pid == exit_required_pid)
{
exit_code = SIGNAL_EXIT_CODE_BASE + WTERMSIG(status);
- safe_logger("sigchld_handler: required PID detected: ", pid, "\n");
+ //safe_logger("sigchld_handler: required PID detected: ", pid, "\n");
}
}
diff --git a/src/signal/signal_status.cc b/src/signal/signal_status.cc
new file mode 100644
index 0000000..c47af48
--- /dev/null
+++ b/src/signal/signal_status.cc
@@ -0,0 +1,22 @@
+#include "signal_handler.h"
+
+namespace ov4
+{
+
+bool check_signal_delivered(int sig)
+{
+ return signal_mask[sig];
+}
+
+void set_signal_delivered(int sig)
+{
+ signal_mask[sig] = true;
+}
+
+void unset_signal_delivered(int sig)
+{
+ signal_mask[sig] = false;
+}
+
+
+} \ No newline at end of file