diff options
| -rw-r--r-- | include/handler.h | 3 | ||||
| -rw-r--r-- | include/util/io.h | 16 | ||||
| -rw-r--r-- | src/eval.cc | 3 | ||||
| -rw-r--r-- | src/handler.cc | 5 |
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"); + } } } } |
