如何通过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 时进程的状态,来看这两种暂停方式的区别。
