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:\>
4 ответа
Нет, вставка символа CTRL-C в ваш процесс не будет работать, поскольку нажатие клавиши CTRL-C захватывается терминалом и преобразуется в сигнал уничтожения, отправляемый процессу.
Правильный код символа (в ASCII) для CTRL-C - код номер 3, но, если вы передадите его в свою программу, он просто получит символ из стандартного ввода. Это не приведет к завершению процесса.
Если вы хотите облегчить задачу поиска и уничтожения процесса, вы можете использовать что-то вроде:
./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}
$!
выдаст идентификатор процесса для последнего запущенного фонового процесса.
В Баше ^C
может быть передан в качестве аргумента в командной строке (и, следовательно, передан echo
для повторения), написав $'\cc'
, Таким образом, желаемая команда:
echo $ '\ cc' |./program_that_does_not_terminate
Я думаю, вам нужно что-то более сложное здесь. Если вы хотите захватить выходные данные программы, вы не можете сразу отправить сигнал уничтожения программе. По сравнению с вашим примером выше, del
команда ожидает ввода, а CTRL+C - не прямой ввод, а сигнал уничтожения.
Я бы предложил решение, в котором вы определяете, перехвачены ли все выходные данные, и затем посылаете сигнал уничтожения. Тем не менее, момент времени, когда все результаты могут быть определены только вами.
Как сказал @paxdiablo, нажатие клавиши CTRL-C фиксируется терминалом и преобразуется в сигнал уничтожения, отправляемый процессу. Поэтому, если ваш процесс подключен к терминалу, вы можете отправить $'\cc', предоставленный @jwodder, этому терминалу, позволяя терминалу отправлять фактический сигнал уничтожения процессу.
Шаг:
1. Скомпилируйте файл C в разделе Выполнить команду в другом терминале через / dev / pts.
2.sudo ./a.out -n /dev/pts/0 $'\cc'
# изменить /dev/pts/0 на tty, к которому прикреплен ваш процесс