Форум программистов
Реклама:
Гарантия безопасности сети с UTM-системой ИКС.
Защита ПД, межсетевой экран, контроль доступа, фильтрация трафика, система предотвращения вторжений.
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Операционные системы > Linux (Ubuntu, Debian, Red Hat, CentOS, Mint)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 29.07.2017, 15:36   #1
v4567
Пользователь
 
Регистрация: 06.07.2008
Сообщений: 45
Репутация: 20
По умолчанию пернаправление ввода

Есть скрипт на BASH, в котором я перехватываю сигналы:
Код:

# Перехватываем сигналы.
 # Завершение работы, сигнал "TERM".
 trap 'vozvrisxzn ; exit 0' SIGTERM
 # Завершение работы, сигнал посланный комбинацией клавиш Ctrl+c.
 trap 'vozvrisxzn ; exit 0' SIGINT
 # Отправка в фон - нажатие Ctrl+z.
 trap 'vozvrisxzn' SIGTSTP
 # Возврат из фона - набор в консоли bg или fg.
 trap 'izfona' SIGCONT
 # Изменение размеров терминала во время работы программы.
 trap 'izmrazmterm' SIGWINCH

Этот код стоит в начале скрипта. Далее после некоторого выполнения скрипта (он выводит некоторую информацию в терминал) он останавливается и ждёт нажатия клавиш командой read. Если вместо read сделать бесконечный пустой цикл, то сигналы обрабатываются сразу. Например после изменения размеров графического эмулятора терминала, выведенная информация отлично подстраивается под изменившиеся размеры терминала.
Когда же мы ждём нажатия клавиш командой read, то после изменения размеров терминала обработка этого сигнала происходит только тогда когда мы нажмём какую нибудь клавишу, то есть только тогда когда отработает команда read. Получается, что обработка сигналов происходит только после окончания выполнения команды во время которой пришёл сигнал.
Поставить маленькое время ожидания read (например -t 0.5 секунд) я не могу, мне же надо что бы сигналы обрабатывались сразу или хотя бы с маленькой задержкой, но не после тога как я нажму на клавишу.
Вариант вижу только один (да и то я не уверен что это можно сделать), read сделать в отдельной функции например fynk() и эту функцию запускать в фоне. Получится так что запуститься дополнительный экземпляр bash с этой функцией, его pid я могу узнать, получаем вот такой код:
Код:

fynk &
PIDFYNK=$!

Теперь вопрос и трудность вот в чём, можно ли как то перенаправить ввод с клавиатуры то есть перенаправить стандартный входной поток (дескриптор файла 0) в этот процесс, функцию fynk и команду в этой функции read? Если можно то как это сделать?

Получается так что у меня на терминал выводит один процесс, а клавиатура должна перенаправляться в процесс работающий в фоне.

Думаю если так сделать можно, то и сигналы будут обрабатываться быстро, так как у меня в процессе запущенном непосредственно в терминале не будет команды read.

За помощь буду заранее благодарен!
v4567 вне форума   Ответить с цитированием
Старый 02.08.2017, 20:28   #2
v4567
Пользователь
 
Регистрация: 06.07.2008
Сообщений: 45
Репутация: 20
По умолчанию

Если использовать просто read то работает.

Но у меня вот такая конструкция:

Код:

while [ true ]
  do

    KEY=""
    zaderjka=""

    for (( i=0 ; i<10 ; i++ ))
     do
       eval $( (IFS="" read -r -s -n 1 $zaderjka key ; printf 'code %d' "'$key") 2>&1 | awk 'NR==1||NR==4 {print $1 "=" $2}' )
       if [ "$code" != "0" ] || [ "$code" = "0" -a "$zaderjka" = "" ]
        then
            KEY=$KEY$code
       fi
       zaderjka="-t 0.01"
    done
done

Вот с такой конструкцией всё останавливается и ждёт нажатия клавиши.

На другом форуме подсказали вот такую конструкцию:

Код:

while [ true ]
  do

    KEY=""
    zaderjka=""

    for (( i=0 ; i<10 ; i++))
     do
       code=""
       IFS="" read -r -s -n 1 $zaderjka key && printf -v code '%d' "'$key"
       [ -n "$code" ] && KEY=$KEY$code
       zaderjka="-t 0.01"
    done
done

При такой конструкции всё нормально, почему при первой останавливалось я так и не понял.
v4567 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как называется технология отображения в подсказке, после ввода точки, до ввода первого символа, метода из другого файла на который ссылается редактируемый файл? lenivaya10001 Свободное общение 1 04.10.2016 22:53
Фокус ввода taras-proger Win Api 1 12.11.2014 21:41
Написать рекурсивную процедуру для ввода с клавиатуры последовательности чи-сел (конец ввода – 0) и вывода её на экран в обратном netiv Паскаль 1 17.02.2012 18:14
Форматирование ввода в колонку dataGridView и проверка правильности ввода tumanovalex C# (си шарп) 1 31.05.2011 19:56
Как сделать запрет ввода букв в поле для ввода input zvezda_t PHP 1 27.12.2009 23:02




17:42.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru