Символ Echo Control C

Мне нужно выполнить grep вывод сторонней программы. Эта программа выгружает данные, но не прерывается, не нажимая ^ c, чтобы завершить ее.

В настоящее время я ищу и убиваю его, используя свой pid. Тем не менее, мне было интересно, если бы можно было отследить контрольный символ C. Псевдо код будет выглядеть как

echo ^c | ./program_that_does_not_terminate

Я могу сделать что-то подобное в DOS, поэтому в Linux должен быть способ.

C:\>echo y | del C:\tmp\*
C:\tmp\*, Are you sure (Y/N)? y
C:\>

Ответ 1

Нет, пересылка символа CTRL-C в ваш процесс не будет работать, потому что нажатие клавиши CTRL-C захватывается терминалом и транслируется в сигнал уничтожения, отправленный процессу.

Правильный код символа (в ASCII) для CTRL-C - это код 3, но, если вы отгоните это на свою программу, он просто получит символ из своего стандартного ввода. Это не приведет к завершению процесса.

Если вы хотите облегчить задачу поиска и убийства процесса, вы можете использовать что-то вроде:

./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}

$! предоставит вам идентификатор процесса для последнего запущенного фонового процесса.

Ответ 2

В Bash a ^C может быть передан как аргумент в командной строке (и, таким образом, передан в echo для эха), написав $'\cc'. Таким образом, желаемая команда:

echo $'\cc' | ./program_that_does_not_terminate

Ответ 3

Попробуйте следующее:

expect -c "send \003;"

Ответ 4

Думаю, вам понадобится нечто более сложное. Если вы хотите захватить вывод программы, вы не можете сразу отправить сигнал об уничтожении в программу. По сравнению с приведенным выше примером команда del ожидает ввода, а CTRL + C не является прямым вводом, а является сигналом kill.

Я бы предложил решение, в котором вы определяете, будет ли весь вывод захвачен и после этого отправить сигнал уничтожения. Hoever, момент времени, когда весь вывод может быть определен только вами.

Ответ 5

Как сказал @paxdiablo, нажатие клавиши CTRL-C фиксируется терминалом и преобразуется в сигнал уничтожения, отправляемый процессу. Поэтому, если ваш процесс подключен к терминалу, вы можете отправить $ '\ cc', предоставленный @jwodder, этому терминалу, позволяя терминалу отправлять фактический сигнал уничтожения процессу.

Шаг:

1. Скомпилируйте файл C в разделе Выполнить команду в другом терминале через /dev/pts.

2. sudo./a.out -n/dev/pts/0 $'\cc' # изменить /dev/pts/0 на tty, к которому прикреплен ваш процесс