我正在开展Tcl
项目,其中某个程序将持续运行。用户可以使用某些键组合随时中止该过程。所以基本上,我需要在trap
代码中Tcl
信号。到目前为止,除了一个问题外,一切都已完成
我正在使用Ctrl+Z
,即SIGSUSP
信号(在Tcl的情况下为SIGTSTP
),这在技术上完成了这项工作。
signal trap sigtstp onAbort
但是,按Ctrl+Z
会立即返回Shell提示符,程序的其余输出将在此之后出现,当输出结束时,不会返回shell提示符(因为它之前已经返回)。我需要再次按Enter
才能得到提示。
以下是我所指的案例。您可以看到在主程序的输出之间返回提示符(polaris@ubuntu:~$
)。
同样作为按Ctrl+Z
的输出,它返回[40]+ Stopped
,这有点烦人。我可以避免这个吗?
使用其他键组合即信号可以避免这整个问题吗?或者我可以通过调整某些内容来Ctrl+Z
避免这种情况吗?
注意:我尝试过使用Ctrl+C
。我得到了完全预期的行为。不幸的是,我无法使用Ctrl+C
,因为它用于其他一些功能。
答案 0 :(得分:2)
C z 导致shell发送当前前台进程SIGSTOP
(19)。无法捕获或忽略此信号,因此您的程序将接收它并运行默认处理程序。这并不是因为你的问题暗示你正在努力杀死这个过程。这只会暂停它,您可以使用fg
on most modern shells将其恢复到前台。
看起来你运气不好。但是,您可以在shell级别重新绑定键盘。这不在你的程序之内,你的最终用户无法控制它。 (参见https://superuser.com/questions/378018/how-can-i-do-ctrl-z-and-bg-in-one-keypress-to-make-process-continue-in-backgroun)
另外,如果你的程序依赖于各种操作的用户输入(因为你建议C-c做其他事情),也许你应该使用curses或其他东西使它成为一个完整的CUI应用程序?