mirror of
https://github.com/apache/nuttx.git
synced 2026-05-18 00:34:10 +08:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user