diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c index 1f20ad5096..0bbb98c5d2 100644 --- a/components/lwp/lwp_signal.c +++ b/components/lwp/lwp_signal.c @@ -1442,3 +1442,41 @@ rt_err_t lwp_pgrp_signal_kill(rt_processgroup_t pgrp, long signo, long code, return rc; } + +struct kill_all_param +{ + long signo; + long code; + lwp_siginfo_ext_t value; +}; + +static int _kill_each(pid_t pid, void *data) +{ + struct kill_all_param *param = data; + rt_lwp_t lwp; + rt_err_t error; + + lwp = lwp_from_pid_locked(pid); + if (lwp && !lwp->sig_protected) + { + error = lwp_signal_kill(lwp, param->signo, param->code, param->value); + } + else + { + error = RT_EOK; + } + + return error; +} + +rt_err_t lwp_signal_kill_all(long signo, long code, lwp_siginfo_ext_t value) +{ + struct kill_all_param buf = + { + .signo = signo, + .code = code, + .value = value, + }; + + return lwp_pid_for_each(_kill_each, &buf); +} diff --git a/components/lwp/lwp_signal.h b/components/lwp/lwp_signal.h index f98b43dd3f..7e7bbad920 100644 --- a/components/lwp/lwp_signal.h +++ b/components/lwp/lwp_signal.h @@ -229,6 +229,8 @@ rt_err_t lwp_signal_setitimer(struct rt_lwp *lwp, int which, rt_bool_t lwp_signal_restart_syscall(struct rt_lwp *lwp, int error_code); +rt_err_t lwp_signal_kill_all(long signo, long code, lwp_siginfo_ext_t value); + #ifdef __cplusplus } #endif diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 598e19ef8a..07d2697958 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -994,7 +994,7 @@ sysret_t sys_kill(int pid, int signo) * of system processes) for which the process has permission to send * that signal. */ - kret = -RT_ENOSYS; + kret = lwp_signal_kill_all(signo, SI_USER, 0); } switch (kret)