Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как я могу проверить STDIN без блокировки в Perl?
Я пишу свое первое приложение Perl - AOL Instant Messenger bot, который разговаривает с Arduino microcontroller, который, в свою очередь, управляет сервомотором, который нажимает кнопку питания на сервере нашего sysadmin, который случайным образом зависает каждые 28 часов или около того.
Я сделал все самое сложное, я просто пытаюсь добавить последний бит кода, чтобы разорвать основной цикл и выйти из AIM, когда пользователь наберет 'quit'.
Проблема в том, что если я попытаюсь прочитать из STDIN в главном цикле программы, он блокирует процесс до тех пор, пока не будет введен ввод, по сути, делая бота неактивным. Я пробовал тестировать для EOF перед чтением,но никаких костей... EOF просто всегда возвращает false.
Вот ниже приведен пример кода, с которым я работаю:
while(1) {
$oscar->do_one_loop();
# Poll to see if any arduino data is coming in over serial port
my $char = $port->lookfor();
# If we get data from arduino, then print it
if ($char) {
print "" . $char ;
}
# reading STDIN blocks until input is received... AAARG!
my $a = <STDIN>;
print $a;
if($a eq "exit" || $a eq "quit" || $a eq 'c' || $a eq 'q') {last;}
}
print "Signing off... ";
$oscar->signoff();
print "Done\n";
print "Closing serial port... ";
$port->close() || warn "close failed";
print "Done\n";
Встроенный Perl - это select() , который является пропуском к системному вызову select() , но для здравомыслящих людей я рекомендую IO::Select .
Пример кода:
#!/usr/bin/perl
use IO::Select;
$s = IO::Select->new();
$s->add(\*STDIN);
while (++$i) {
print "Hiya $i!\n";
sleep(5);
if ($s->can_read(.5)) {
chomp($foo = <STDIN>);
print "Got '$foo' from STDIN\n";
}
}
Я обнаружил, что IO::Select работает нормально, пока STDOUT закрывается, например, когда вышестоящий процесс в конвейере завершается или вводится из файла. Однако если вывод продолжается (например, из "tail-f"), то любые частичные данные, буферизованные <STDIN> , не будут отображаться. Вместо этого используйте unbuffered sysread :
#!/usr/bin/perl
use IO::Select;
$s = IO::Select->new(\*STDIN);
while (++$i) {
if ($s->can_read(2)) {
last unless defined($foo=get_unbuf_line());
print "Got '$foo'\n";
}
}
sub get_unbuf_line {
my $line="";
while (sysread(STDIN, my $nextbyte, 1)) {
return $line if $nextbyte eq "\n";
$line .= $nextbyte;
}
return(undef);
}