如何通过Ctrl S在不挂起前台进程的情况下停止[apue]输出?

摘要:之前一直知道使用 Ctrl+Z 挂起前台进程来阻止进程运行,之后可以再通过 shell 的作业控制 (jobsfg N) 来将后台进程切换为前台,从而继续运行。 最近学到一种新的方法,对于不停有 console 输出
之前一直知道使用 Ctrl+Z 挂起前台进程来阻止进程运行,之后可以再通过 shell 的作业控制 (jobs / fg N) 来将后台进程切换为前台,从而继续运行。 最近学到一种新的方法,对于不停有 console 输出的前台进程,可以使用 Ctrl+S 来 STOP 一个进程的输出,从而暂停进程。 之后可以通过 Ctrl+Q 或输入任意字符来重启 (START) 进程输出,从而继续运行。 看到这个方法,立即想到写个脚本验证一下: deadloop.sh 1 #! /bin/sh 2 var=1 3 while : 4 do 5 echo this is $var 6 var=$(($var+1)) 7 usleep 100000 8 done 这个脚本每 100 毫秒输出一条日志 “this is N”,其中 N 为日志序号,可以帮我们确定在一次暂停与重启之间,是否有输出丢失。 运行过程中按下 Ctrl+S,输出果然暂停了: >./deadloop.sh this is 1 this is 2 this is 3 this is 4 再按下 Ctrl+Q 则输出继续,直到按下 Ctrl+Z 挂起进程: >./deadloop.sh this is 1 this is 2 this is 3 this is 4 this is 5 this is 6 this is 7 this is 8 this is 9 this is 10 this is 11 ^Z [1]+ Stopped ./deadloop.sh > 首先可以看到重启后的输出序号与重启前的可以接上,所以中间并没有输出丢失,也就是说是进程被暂停了,而不只是输出停止了。 其次在按下 Ctrl+Z 时终端会回显 ^Z,而按下 Ctrl+S 或 Ctrl+Q 时,终端没有任何回显。 于是重点对比按下 Ctrl+S 时与 Ctrl+Z 时进程的状态,来看这两种暂停方式的区别。
阅读全文