Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: пернаправление ввода  (Прочитано 749 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн v4567

  • Автор темы
  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
пернаправление ввода
« : 29 Июля 2017, 14:29:46 »
У меня вопрос скорее общего назначения.

Есть скрипт на 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.

За помощь буду заранее благодарен!

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28469
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #1 : 29 Июля 2017, 19:11:35 »
Вы, конечно, в курсе, что работает только самый последный trap ?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн v4567

  • Автор темы
  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #2 : 29 Июля 2017, 20:34:59 »
Вы, конечно, в курсе, что работает только самый последный trap ?

Вы имеете ввиду то, что:
# Завершение работы, сигнал "TERM".
 trap 'vozvrisxzn ; exit 0' SIGTERM
 # Завершение работы, сигнал посланный комбинацией клавиш Ctrl+c.
 trap 'vozvrisxzn ; exit 0' SIGINT
 # Отправка в фон - нажатие Ctrl+z.
 trap 'vozvrisxzn' SIGTSTP
 # Возврат из фона - набор в консоли bg или fg.
 trap 'izfona' SIGCONT
не будут работать, или то что по завершении обработку на эти сигналы надо возвращать в систему?

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28469
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #3 : 30 Июля 2017, 02:13:12 »
Имелось в виду, что
1. ваши трапы не имет отношения к задаче,
2. на каждый сигнал может быть только один трап.
LESS='+/^\s+trap\b \[' man bash
В целом, вам нужен сокет для обмена с приложением
man mkfifo
LESS='+/^\s+exec\b \[' man bash
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн v4567

  • Автор темы
  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #4 : 02 Августа 2017, 19:25:35 »
Если использовать просто 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

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #5 : 02 Августа 2017, 20:02:30 »
Когда же мы ждём нажатия клавиш командой read, то после изменения размеров терминала обработка этого сигнала происходит только тогда когда мы нажмём какую нибудь клавишу, то есть только тогда когда отработает команда read.
#!/bin/bash

trap 'date' SIGWINCH

read N

echo END
При каждом изменении размеров терминала сигнал обрабатыватся, и date выполняется. Ты что-то перемудрил.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28469
    • Просмотр профиля
Re: пернаправление ввода
« Ответ #6 : 02 Августа 2017, 23:18:55 »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.019 секунд. Запросов: 23.