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

时间:2018-02-02 02:10:48

标签: makefile terminal blocking gnu-screen pty

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

例如,以下bash one-liner未被复制模式阻止:

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

如果你运行它,然后调用复制模式(CTRL + A ESCAPE),等待几秒钟,然后离开模式(ESCAPE),输出将跳转,因为它继续在复制显示“后面”运行。

但是如果你拿一个C Makefile并且做同样的事情,你会看到在某些情况下冻结中的编译,并且不会在幕后继续。只有当您离开复印模式时才会继续。

然而并非适用于所有Makefile:

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

有人可以对此有所了解吗?它与屏幕内的流量控制有关,还是与obuflimit有关?我已经玩了很多这些设置,但我真的不清楚发生了什么以及如何影响它。显然,屏幕无法永远保存输出,因为这将占用无限的内存,但缓冲区的大小是多少,有没有办法改变这一点,以便具有重要输出的make的调用可以在后面运行完成复印模式显示?

1 个答案:

答案 0 :(得分:1)

限制不在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将继续运行。