diff --git a/graphics/input/monkey/monkey_main.c b/graphics/input/monkey/monkey_main.c index 43b0561c0..f495bea59 100644 --- a/graphics/input/monkey/monkey_main.c +++ b/graphics/input/monkey/monkey_main.c @@ -516,6 +516,7 @@ static enum monkey_wait_res_e monkey_wait(uint32_t ms) sigemptyset(&set); sigaddset(&set, SIGTSTP); + sigaddset(&set, SIGTERM); ret = sigtimedwait(&set, NULL, &timeout); @@ -539,10 +540,24 @@ static enum monkey_wait_res_e monkey_wait(uint32_t ms) { res = MONKEY_WAIT_RES_PAUSE; } + else if (ret == SIGTERM) + { + MONKEY_LOG_WARN("Recv sig: SIGTERM"); + res = MONKEY_WAIT_RES_STOP; + } return res; } +/**************************************************************************** + * Name: signal_handler + ****************************************************************************/ + +static void signal_handler(int sig) +{ + MONKEY_LOG_WARN("Recv sig: %d", sig); +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -565,8 +580,26 @@ int main(int argc, FAR char *argv[]) struct monkey_param_s param; FAR struct monkey_s *monkey; uint32_t start_tick; + sigset_t mask; + parse_commandline(argc, argv, ¶m); + /* Block SIGTERM and let sigtimedwait() consume it: the signal mask + * and pending queue are per task, so sibling monkey instances stop + * independently, and a signal arriving outside the wait window stays + * pending instead of being swallowed by the handler. + */ + + sigemptyset(&mask); + sigaddset(&mask, SIGTERM); + sigprocmask(SIG_BLOCK, &mask, NULL); + + /* Add signal handler to avoid system default handler */ + + signal(SIGTSTP, &signal_handler); + signal(SIGCONT, &signal_handler); + signal(SIGTERM, &signal_handler); + monkey = monkey_init(¶m); if (!monkey)