Прервите ввод и вывод от определенного исполняемого файла

То, что это делает, совершенно специализировано. При нажатии ctrl+c эмулятор терминала отправляет сигнал SIGINT в приоритетное приложение, которое инициировало соответствующий "обработчик сигналов". Обработчик сигналов по умолчанию для SIGINT завершает приложение. Но любая программа может установить свой собственный обработчик сигналов для SIGINT (включая обработчик сигналов, который не останавливает выполнение вообще).

По-видимому, vlc устанавливает обработчик сигналов, который пытается сделать некоторую очистку / корректное завершение на первый раз, когда это вызывается и отступает к поведению по умолчанию немедленно завершающегося выполнения, когда это вызывается во второй раз.

6
05.05.2011, 10:53
4 ответа

Опция 1 состояла бы в том, чтобы изменить исходный код приложения вызова и вставить tee в вывод конвейерно обрабатывают для получения копии вывода для обзора на том этапе.

Опция 2 состояла бы в том, чтобы записать сценарий обертки вокруг рассматриваемого исполняемого файла. Быстрый сценарий, который передает stdin и аргументы реальному приложению, затем мишень вывод к местоположению для Вас для рассмотрения и также слюна, это отступает тот же путь приложение, был бы, должна быть просто пара строк, чтобы сделать на скорую руку. Поместите его где-нибудь особенный и сделайте, добавляют, что местоположение к передней стороне Вашей переменной ПУТИ, затем запустите свое приложение.

#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output
6
27.01.2020, 20:24
  • 1
    Спасибо за идею я попробовал его, но замена исполняемого файла со сценарием оболочки не работает, к сожалению. Я не могу изменить исходный код приложения вызова также. –  Mad Scientist 04.05.2011, 17:48
  • 2
    @Fabian В целом, это ДЕЙСТВИТЕЛЬНО работает, я должен был несколько раз делать это. Действительно необходимо знать, что соединить проводом до каждого конца; в основном все опции ввода/вывода на обоих концах должны быть непосредственно исправлены через. Это могло включать захват и передачу сигналов. Можно ли объяснить, почему это "не работает" на Вас? –  Caleb 04.05.2011, 23:11
  • 3
    я добавил свой успех к моему вопросу. Вы правы, что это работает, мой сценарий работает точно, как это должно с тестовым входом. Но это не выполняется оболочкой по некоторым причинам при вызове из большой программы. –  Mad Scientist 04.05.2011, 23:22
  • 4
    Извините за беспорядок это была просто ошибка в хижине, вызывающей проблему. –  Mad Scientist 05.05.2011, 10:53

Можно получить большую информацию о программе путем вызова его под strace. Это показывает каждый системный вызов, что программа делает, который может иногда быть слишком большой информацией, но может быть большой справкой для нахождения то, что идет не так, как надо.

Приблизьтесь нужно запустить Ваше большое приложение под strace. Это, вероятно, произведет большой вывод и замедлит Ваше приложение.

strace -s9999 -efile,process -f -o bigapp.strace bigapp

Если большое приложение является интерактивным, можно предпочесть запускать его и подключать strace к нему, после того как Вы готовы инициировать вычисления. Отметьте идентификатор процесса приложения, скажите 12345 и работайте

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

Если достаточно заметить, что внешний исполняемый файл, то как другое ответы уже предложили, заменяет тот исполняемый файл сценарием обертки. Можно переместить исполняемый файл в другое имя и положить сценарий обертки на его место или поместить сценарий обертки перед обычным исполняемым файлом в PATH, или настройте приложение для вызова сценария обертки вместо обычного исполняемого файла, независимо от того, что удобно. Сделайте тот сценарий обертки

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

Объяснение strace параметров использовало:

  • -e выбирает системные вызовы трассировки. Можно указать системные вызовы по имени или использовать несколько категорий такой как file (open, close, read, write, …) и process (fork, execve, …).
  • -f делает strace, следует за ветвлениями, т.е. подпроцессами трассировки, а также исходным процессом.
  • -o выбирает название файла, содержащего трассировку. $$ конструкция оболочки, которая обозначает идентификатор процесса процесса оболочки (из-за использования exec в последнем сценарии обертки, который также будет идентификатором процесса дополнительного приложения).
  • -s9999 заставляет его отобразить это много байтов для read и write и другие вызовы.
3
27.01.2020, 20:24

Вместо того, чтобы изменять Ваш путь, необходимо переместить двоичный файл, которым Вы интересуетесь от "двоичного файла" до "binary.orig", затем заменяют его сценарием. Вы сказали, что интересуетесь аргументами, таким образом, Вы захотите выписать аргументы в файл также. Вы будете, вероятно, также интересоваться выводом команды "ENV". Это выводит все в настоящее время активные переменные среды. Переменные среды часто используются одной программой для влияния на поведение другой программы, которую это называет.

2
27.01.2020, 20:24

У меня работает следующее:

cat - | tee /tmp/in.log | /path/to/realapp $@ | tee /tmp/out.log

0
27.01.2020, 20:24

Теги

Похожие вопросы