^C SIGINT 在 Linux 的 adb shell 中不起作用

^C SIGINT 在 Linux 的 adb shell 中不起作用

我正在开发一个嵌入式 Linux 系统,它使用 kernel-5.10.24。
它使用 busybox 作为 init,并在 rootfs 中具有其他实用程序,包括 adbd。
我可以adb shell从 PC 运行来登录嵌入式系统,然后我启动一个 shell 脚本来循环执行某些操作。

但我发现当我输入^C中断脚本时,它失败了。我必须^Z先使用,然后kill -9 xxx停止脚本运行。

当过程是停止了通过^Z,它读取了它/proc/pid_of_script/status,我发现了以下内容,

SigPnd: 00000000000000000000000000000000
ShdPnd: 00000000000000000000000000020000
SigBlk: 00000000000000000000000000020000
SigIgn: 00000000000000000000000000001006
SigCgt: 00000000000000000000000000020000

SigIgn 屏蔽了 SIGINT (2)。然后我检查了它的父进程和祖父进程(adbd),我发现它们都忽略了信号处理中的SIGINT。

adbd 由 /etc/init.d/rcS 启动,它调用 S50usb(S50usb 还调用另一个脚本)。

然后我更改为在shell运行后在/etc/inittab中启动S50usb。但我得到了和以前一样的结果。

我想知道是否有办法在运行时调整脚本进程的SigIgn,然后SIGINT可以停止其运行?

答案1

根据 LL3 的评论和答案将程序作为守护进程运行和使用“&”将其分叉到后台有什么区别?我得到了解决方案。
adbd 由脚本启动adbd &,并将其置于后台。
作为后台进程,adbd 已设置为忽略 SIGINT。
解决方案可能是使用start-stop-daemonscript 在脚本中启动 adbd,而不是adbd &直接使用。

相关内容