根据信号的描述(参考),似乎 SIGTTIN 和 SIGTTOU 仅在进程处于后台时才会发送到该进程。如果启用了此类流量控制,则按下Ctrl-s
确实会停止终端中的打印。所以问题是,是否有可能实际将 SIGTTIN/SIGTTOU 信号传递给当前位于前台的进程并捕获它?
例如,将以下代码保存在文件中,chmod +x
然后运行它。然后按Ctrl-s
/ Ctrl-q
。您会注意到它Ctrl-s
确实停止并Ctrl-q
恢复打印。但文件./trap.log
文件将为空。
#!/usr/bin/env zsh
touch ./trap.log
trap 'echo TSTP >>./trap.log' TSTP
trap 'echo TTIN >>./trap.log' TTIN
trap 'echo TTOU >>./trap.log' TTOU
trap 'echo CONT >>./trap.log' CONT
for ((i=1;i>0;i=i+1)); do
printf "print $i\n"
sleep 1
done
答案1
您可以使用 发送 SIGTTIN 或 SIGTTOU kill
,就像任何其他信号一样。您可以使用 (in sh) 捕获它们trap
,就像任何其他(可捕获的)信号一样。但Ctrl+S和Ctrl+Q信号无关。它们由终端处理,而不是由应用程序处理。
如果您希望应用程序将其Ctrl+S视为“暂停输出”命令,请确保终端不会捕获这些字符(stty -ixoff
或tcsetattr
等效字符),并像处理任何其他输入一样处理它们。