aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/handler.h3
-rw-r--r--include/util/io.h16
-rw-r--r--src/eval.cc3
-rw-r--r--src/handler.cc5
4 files changed, 27 insertions, 0 deletions
diff --git a/include/handler.h b/include/handler.h
index 100c548..8878eec 100644
--- a/include/handler.h
+++ b/include/handler.h
@@ -9,6 +9,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
+#include <atomic>
#include "all.h"
@@ -22,6 +23,8 @@ extern sigset_t
block_job,
block_io;
+inline std::atomic_int exit_code, exit_required_pid;
+
void signal_init();
handler_t *Signal(int signum, handler_t *handler);
void sigchld_handler(int sig);
diff --git a/include/util/io.h b/include/util/io.h
index e995af5..5c0a129 100644
--- a/include/util/io.h
+++ b/include/util/io.h
@@ -99,6 +99,22 @@ void safe_output(T x, T_arg ...arg)
errno = errno_old;
}
+// async-signal-safe output function
+// example:
+// safe_output("string", 123, variable);
+template <typename ...T_arg>
+void safe_logger(T_arg ...arg)
+{
+ int errno_old = errno;
+
+ if (GLOBAL_DEBUG && verbose)
+ {
+ safe_output(arg...);
+ }
+
+ errno = errno_old;
+}
+
void unix_error(const char *msg);
void app_error(const char *msg);
diff --git a/src/eval.cc b/src/eval.cc
index becad3b..9c0210d 100644
--- a/src/eval.cc
+++ b/src/eval.cc
@@ -21,6 +21,7 @@
#include "lexer/token.h"
#include "lexer/enum_type.h"
#include "lexer/symbol_property.h"
+#include "handler.h"
using namespace std;
@@ -102,6 +103,8 @@ int eval_exe(string s, bool is_aync)
// parent
+ exit_required_pid = pid;
+
if (!is_aync) // foreground
{
addjob(pid, FG, cmdline);
diff --git a/src/handler.cc b/src/handler.cc
index 5850141..f611784 100644
--- a/src/handler.cc
+++ b/src/handler.cc
@@ -114,6 +114,11 @@ void sigchld_handler([[maybe_unused]] int sig)
if (WIFEXITED(status))
{
safe_output("Exit code: ", WEXITSTATUS(status), "\n");
+ if (pid == exit_required_pid)
+ {
+ exit_code = WEXITSTATUS(status);
+ safe_logger("sigchld_handler: required PID detected: ", pid, "\n");
+ }
}
}
}