drivers/serial: Fix SIGINT not delivered to foreground process on Ctrl-C.

When pressing Ctrl-C, the foreground process did not receive SIGINT
and failed to terminate.

The serial driver called nxsig_tgkill(-1, dev->pid, signo) from
interrupt context. With pid=-1, nxsig_dispatch() was called with
thread=true, which requires stcb->group == this_task()->group.
However, in interrupt context, this_task() returns the IDLE task,
whose group differs from the target process group. This caused
the signal dispatch to fail with -ESRCH.

Solution:
Replace nxsig_tgkill(-1, pid, signo) with nxsig_kill(pid, signo).
nxsig_kill() uses thread=false, which routes through group_signal()
without the same-group check, allowing signals to be delivered
correctly from interrupt context.

Impact:
- Fixes Ctrl-C signal delivery in serial console
- No API changes
- Affects serial driver interrupt handling only

Testing: Verified on QEMU ARM64 simulator with serial console

Signed-off-by: yinshengkai <yinshengkai@bytedance.com>
This commit is contained in:
yinshengkai
2025-12-30 20:02:41 +08:00
committed by Xiang Xiao
parent 72117428fb
commit 2bfff207fd
2 changed files with 2 additions and 2 deletions
+1 -1
View File
@@ -354,7 +354,7 @@ void uart_recvchars_done(FAR uart_dev_t *dev)
if (signo != 0)
{
nxsig_tgkill(-1, dev->pid, signo);
nxsig_kill(dev->pid, signo);
}
#endif
}
+1 -1
View File
@@ -311,7 +311,7 @@ void uart_recvchars(FAR uart_dev_t *dev)
if (signo != 0)
{
nxsig_tgkill(-1, dev->pid, signo);
nxsig_kill(dev->pid, signo);
}
#endif
}