Вопрос

Я пытаюсь поймать SIGINT CTRL + C в цикле чтения на розетке, но перерыв, который я прошу, только обработанный после новой линии.Поэтому, когда я Ctrl + C моего приложения, я должен ждать новую строку, чтобы прийти в сокет до перерывов петли / приложение выходит

Это минимальная версия:

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3
.

Как я могу сразу сломать петлю и выйти из приложения?

Это было полезно?

Решение

Генеракодицетагкод - это не реальная команда, которую вы можете выполнить, где вы хотите;Это просто синтаксическая конструкция, чтобы отметить точку, где оставить окружающий цикл.Ваш break не имеет окружающего цикла, поэтому он не имеет смысла (и является ошибкой: break).

Вам необходимо убить команду bash: break: only meaningful in a `for', `while', or `until' loop вместо этого:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid
.

Конечно, это всего лишь очень грубый раствор, не скрывая любые сообщения об ошибках, выпущенных завершенными сумаслями и т. Д., Но он показывает идею и решает вопрос, о котором вы спрашивали.Для скрытия ожидаемого сообщения об ошибке и т. Д. Вы можете захотеть задать другие вопросы (или просто поиск уже данных ответов здесь; -)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top