在前台进程中发送并捕获 SIGTTIN SIGTTOU?

在前台进程中发送并捕获 SIGTTIN SIGTTOU?

根据信号的描述(参考),似乎 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+SCtrl+Q信号无关。它们由终端处理,而不是由应用程序处理。

如果您希望应用程序将其Ctrl+S视为“暂停输出”命令,请确保终端不会捕获这些字符(stty -ixofftcsetattr等效字符),并像处理任何其他输入一样处理它们。

相关内容