gpt4 book ai didi

perl - 为什么我的 perl 守护进程不打印?

转载 作者:行者123 更新时间:2023-12-01 05:27:16 25 4
gpt4 key购买 nike

我正在调试一个守护进程,我正在尝试使用 print 语句将信息输出到终端。我的代码的要点是:

#!/usr/bin/env perl

use strict;
use warnings;

use Readonly;

Readonly my $TIMEOUT => ...;

...

while (1) {

print "DEBUG INFO";

...

sleep $TIMEOUT;
}

但是,它没有输出到我的终端。这是为什么?

最佳答案

总结:

使用$| = 1 或在打印中添加换行符 "\n"

说明:

这不打印到终端的原因是因为 perl 正在缓冲输出以提高效率。一旦打印缓冲区被填满,它将被刷新并且输出将出现在您的终端中。您可能需要强制刷新缓冲区,因为根据 $TIMEOUT 的长度,您可能需要等待相当长的时间才能输出!

刷新缓冲区有两种主要方法:

1) 当您打印到您的终端时,您的文件句柄很可能是 STDOUT。默认情况下,附加到终端的任何文件句柄都处于行缓冲模式,我们可以刷新缓冲区并通过向您的 print 语句添加换行符来强制输出:

while (1) {
print "DEBUG INFO\n";
...
sleep $TIMEOUT;
}

2) 第二种方法是使用 $|当设置为非零时,使当前文件句柄(STDOUT 默认情况下或最后一个被selected)并强制刷新缓冲区立即。因此,下面也会强制打印调试信息:

$| = 1;
while (1) {
print "DEBUG INFO";
...
sleep $TIMEOUT;
}

如果使用这样的语法令人困惑,那么您可能需要考虑:

use IO::Handle;
STDOUT->autoflush(1);

while (1) {
print "DEBUG INFO";
...
sleep $TIMEOUT;
}

在许多需要立即刷新缓冲区的代码示例中,您可能会看到 $|++ 用于使文件句柄变热并立即刷新缓冲区,而 -- $| 使文件句柄变冷并关闭自动刷新。有关详细信息,请参阅这两个答案:

如果您有兴趣了解有关 perl 缓冲区的更多信息,那么我建议您阅读 Suffering from Buffering ,它深入了解了为什么我们有缓冲,并解释了如何打开和关闭它。

关于perl - 为什么我的 perl 守护进程不打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com