如何控制 GNU 屏幕的阻塞行为

How to control GNU screen's blocking behaviour

为什么 GNU 屏幕在设置为复制模式时有时会阻止内部进程,而其他时候却不会?

例如,下面的bash一行不被复制模式屏蔽:

while ((1)) ; do echo $i; i=$((i+1)); sleep 0.1; done

如果你运行这个,然后调用复制模式(CTRL+A ESCAPE),等待几秒钟,然后离开模式(ESCAPE),输出会跳转,因为它继续到运行 "behind"复制显示。

但是如果您使用 C Makefile 并执行相同的操作,您会发现在某些情况下,其中的编译会冻结,并且不会在幕后继续进行。只有当您离开复制模式时它才会继续。

但不是所有的 Makefiles:

.PSEUDO: count
count:
    number=1 ; while (true) ; do \
        echo $$number ; \
        number=$$((number + 1)) ; \
        sleep 0.1 ; \
    done

任何人都可以阐明这一点吗?它与屏幕内的流量控制有关,还是与 obuflimit 有关?我玩过很多这样的设置,但我真的不清楚发生了什么以及如何影响它。显然 screen 不能永远保存输出,因为那样会占用无限的内存,但是缓冲区的大小是多少,有什么方法可以改变它,以便调用 make 并产生大量输出可以 运行复制模式显示后完成?

限制不在screen。每个 tty/pty 都有一个输入缓冲区和输出缓冲区。当输入(或输出)缓冲区已满时,读取(或写入)缓冲区的进程将被阻塞或丢失一些数据。

不确定缓冲区大小是否可以更改,但您可以通过以下方式解决:

touch make.log
tail -f make.log &
make >> make.log 2>&1
# when `make' is done, kill the `tail', e.g. with bash:
kill %%

然后当您进入屏幕的复制模式时,它只能阻止 tail 进程并且 make 将保持 运行。