2015-09-20 3 views
3

Я отлаживаю демона, и я пытаюсь использовать операторы print для вывода информации на терминал. Суть моего кода:Почему мой демон perl не будет печатать?

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Readonly; 

Readonly my $TIMEOUT => ...; 

... 

while (1) { 

    print "DEBUG INFO"; 

    ... 

    sleep $TIMEOUT; 
} 

Однако, нет вывода, который он печатает на моем терминале. Почему это?

+0

STDOUT демона обычно целенаправленно направлен куда-то, кроме терминала. Как вы демонизировали программу? – ikegami

ответ

7

Резюме:

Использование $| = 1 или добавить новую строку, "\n" к печати.

Пояснение:

Причина этого не печатает на терминале происходит потому, что Perl буферизует выходные данные для повышения эффективности. Как только буфер печати будет заполнен, он будет очищен, и выход появится в вашем терминале. Может быть желательно, чтобы вы принудительно промывали буфер, так как в зависимости от длины $TIMEOUT вы могли ожидать значительный отрезок времени для вывода!

Есть два основных подхода к промывке буфер:

1) Как вы печатаете на терминал, то ваш указатель_на_файл скорее всего STDOUT. Любой файл ручка прилагается к терминалу, по умолчанию в режиме линейного буферного, и мы можем очистить буфер и заставить вывод, добавляя символ новой строки к вашему print заявлению:

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

2) Второй подход заключается в для использования $|, который при установке на ненулевое значение делает текущую дескриптор файла (STDOUT по умолчанию или последним будет select ed) hot и немедленно выдает смыв буфера. Таким образом, следующее будет также принудительно печать отладочной информации:

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

При использовании синтаксиса, это сбивает с толку, то вы можете, как рассмотреть следующие вопросы:

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

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

Во многих примерах кода, где непосредственный смыва буфера требуется, вы можете увидеть, что $|++ используется для создания файла-дескриптора hot и немедленно сбрасывает буфер, и --$|, чтобы сделать файл-дескриптор холодным и отключить авто-промывку. См эти два ответа для более подробной информации:

Если вы заинтересованы в получении дополнительной информации о PERL буферов, то я хотел бы предложить чтение Suffering from Buffering, что дает глубокое понимание того, почему мы буферизируем и объясняем, как включать и выключать его.

Смежные вопросы