2016-11-22 7 views
1

Я работаю над проектом Tcl, где определенная процедура будет работать непрерывно. пользователь может прервать эту процедуру в любое время, используя некоторую комбинацию клавиш. Так что в принципе, мне нужно до trap сигнал в коде Tcl. Пока все сделано, кроме одной проблемы.Что такое сигналы linux, которые могут быть захвачены в Tcl

Я использую Ctrl+Z. Т.е. SIGSUSP сигнал (SIGTSTP в случае Tcl), который технически выполняет эту работу.

signal trap sigtstp onAbort 

Но нажатие Ctrl+Z немедленно возвращает строку Shell, остальная часть выхода из программы приходит после того, что и когда выход подходит к концу, не командная строка не возвращается (как уже вернулся раньше). Мне нужно снова нажать Enter, чтобы получить приглашение.

Ниже приводится случай, на который я ссылаюсь. Вы можете увидеть, что приглашение ([email protected]:~$) возвращается между выходом основной программы.

enter image description here

Кроме того, в качестве выходного сигнала нажатия Ctrl+Z, он возвращается [40]+ Stopped, который немного раздражает. Могу ли я избежать этого?

Могу ли я избежать этой проблемы, используя какой-либо другой сигнал комбинации клавиш? Или я могу избежать этого с помощью Ctrl+Z, а также что-нибудь?

ПРИМЕЧАНИЕ. Я попытался использовать Ctrl+C. С этим я получил точно ожидаемое поведение. К сожалению, я не могу использовать Ctrl+C, поскольку он используется для некоторых других функций.

ответ

2

Сг вызывает оболочку для отправки текущего переднего плана процесса с участием SIGSTOP (19). Этот сигнал нельзя поймать или проигнорировать, и ваша программа получит его и запустит обработчик по умолчанию. Это не убивает процесс, так как ваш вопрос подсказывает, что вы пытаетесь сделать. Это только приостанавливает его, и вы можете вернуть его на передний план, используя fg on most modern shells.

Похоже, вам не повезло. Тем не менее, вы можете восстановить привязку клавиш на уровне оболочки. Однако это вне вашей программы, и ваши конечные пользователи не контролируют ее. (Cf. https://superuser.com/questions/378018/how-can-i-do-ctrl-z-and-bg-in-one-keypress-to-make-process-continue-in-backgroun)

Кроме того, если ваша программа использует пользовательские входы для различных действий (так как вы предполагаете, что C-c делает что-то еще), возможно, вы должны сделать это полноценным CUI-приложением, используя проклятия или что-то еще?

+1

На самом деле 'Ctrl' +' z' отправляет SIGTSTP, который _can_ будет перехвачен. По-прежнему очень рекомендуется останавливать процесс, когда он отправляется, но некоторая очистка (например, терминала) может быть выполнена по пути. –

+0

Спасибо! Я не знал об этом. –

 Смежные вопросы

  • Нет связанных вопросов^_^