【发布时间】:2017-08-30 06:16:21
【问题描述】:
这是我的程序
my $input;
my $finish = 0;
my $timer = 5; # 5 seconds
eval {
while( ! $finish ) {
local $SIG{ALRM} = sub {
# check counter and set alarm again
if (--$timer) { alarm 1 }
# no more waiting
else { die "timeout getting the input \n" }
};
# alarm every second
alarm 1;
$input = <STDIN>;
alarm 0;
if ( $input ) {
chomp $input;
if( $input ){
print( "Received input : $input" );
$finish = 1;
} else {
print( "Please enter valid input" );
}
} else {
print( "input is undefined" );
last;
}
}
};
if ($@ || !$input) {
print( "Timeout in getting input." );
return undef;
}
return $input;
STDIN 在前台运行良好。但是在运行相同的程序后台时失败。如果用户在 5 秒内没有输入任何输入,则逻辑是退出循环。但是在后台运行时,进程应该在 x 秒内退出,但进程会卡在<STDIN> 行。
如何解决这个问题?
【问题讨论】:
-
每个程序在放在后台时都会挂在 STDIN 上。它应该从哪里获得输入?
-
用户应在 x 秒内输入,否则程序应退出 while 循环。由于这是在后台,用户输入是不可能的,所以程序应该在 x 秒后退出,这不会发生。
-
我明白了。尝试 getc 并设置 tty 选项,如下所示:perldoc.perl.org/functions/getc.html
-
@yacc 有一个
tostop标志,但没有tistop标志:)