Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148

Trap и пернаправление ввода

29.07.2017, 14:44. Показов 892. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это попытка решить проблему которую описывал в других темах.

Есть скрипт на BASH, в котором я перехватываю сигналы:
Code
1
2
3
4
5
6
7
8
9
10
11
# Перехватываем сигналы.
 # Завершение работы, сигнал "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 я могу узнать, получаем вот такой код:
Code
1
2
fynk &
PIDFYNK=$!
Теперь вопрос и трудность вот в чём, можно ли как то перенаправить ввод с клавиатуры то есть перенаправить стандартный входной поток (дескриптор файла 0) в этот процесс, функцию fynk и команду в этой функции read? Если можно то как это сделать?

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

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

За помощь буду заранее благодарен!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.07.2017, 14:44
Ответы с готовыми решениями:

Скрыть процесс X Trap
Все доброго времени суток.Не подскажите как скрыть или убить процесс X Trap?Заранее спасибо.)

Trap в функции pipline
Почему такой код выдает ошибку, получается trap не работает в функциях pipline? function Out-FileLog { trap { write-host $_...

Trap: undefinded address
Берутся 2 числа: одно пишется в регистр D, другое в ячейку по адресу 930. Сделать логическое сложение - если число единиц в результате...

2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
29.07.2017, 17:41
Цитата Сообщение от v4567 Посмотреть сообщение
Если вместо read сделать бесконечный пустой цикл, то сигналы обрабатываются сразу. Например после изменения размеров графического эмулятора терминала, выведенная информация отлично подстраивается под изменившиеся размеры терминала.
При изменении размеров окна графического эмулятора терминала управление получает этот эмулятор, работающий параллельно с шеллом. Управление он получает в общем случае не через систему сигналов Юникс. Почему он в одном случае перерисовывает строки текста, а в другом нет - вопрос к нему. Наверное, он не может одновременно ожидать ввод и перерисовывать вывод. Поэсперементируйте с другими эмуляторами.
А вот при нажатии, например Сtrl-C, сигнал завершения получит оболочка и если сигнал не перехвачен и не заблокирован, оболочка должна завершиться независимо от того, выполняет она read или бесконечный цикл.
0
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
02.08.2017, 19:31  [ТС]
Если использовать просто read то работает.

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
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
Вот с такой конструкцией всё останавливается и ждёт нажатия клавиши.

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
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
При такой конструкции всё нормально, почему при первой останавливалось я так и не понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2017, 19:31
Помогаю со студенческими работами здесь

kernel trap 19 with interrupts disabled
Всем привет! Сегодня в логах обнаружил: Sep 4 21:04:21 root kernel: kernel trap 19 with interrupts disabled Sep 4 21:04:21...

unexpected kernel mode trap
Синий экран и эта надпись. Как узнать в чем проблема?

Unexpected kernel mode trap
Добры день! Имеется случайные вылеты и перезагрузки, которые не связанны объективно с каким-то событием. Началось всё несколько недель...

UNEXPECTED KERNEL MODE TRAP(windows 8.1)
На ноутбуке стоит windows 8.1, решил подключиться к интернету через кабель(TP-LINK TD-8810).. После подключения проходит пару минут 10 и...

unexpected kernel mode trap windows 8
Доброго времени суток! Вылез БСОД с ошибкой unexpected kernel mode trap, ось win 8 :( Ктонибудь подскажите как узнать код этой ошибки? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru