Как я могу следить за связью между процессом и терминалом? - PullRequest
7 голосов
/ 05 августа 2010

У меня есть процесс Linux, разработанный сторонней организацией, которая взаимодействует с терминалом. Для отладки я хочу, чтобы сообщение вернулось вперед.

Кто-то может подумать, что cat сделает свое дело (чтобы увидеть одно направление):

    ./third-party-app &
    cat /dev/tty

... но это не так. Скорее всего, cat похитит половину данных, предназначенных для приложения, что в значительной степени бесполезно.

стороннее приложение жестко запрограммировано на /dev/tty.

Один из способов шпионить за сообщением - переименовать устройство /dev/tty, скажем, в /dev/real_tty и создать вместо него именованный канал с именем /dev/tty. Затем работает:

    cat /dev/real_tty | tee /dev/tty &

... по крайней мере позволит мне увидеть вывод /dev/real_tty, скопировав данные из /dev/real_tty в именованный канал /dev/tty и stdout.

Такого рода работы, но они кажутся очень хитрыми и основаны на хитрости замены устройства. Он также не работает в обоих направлениях, потому что именованные каналы переносят данные только в одном направлении.

Как правильно это сделать?

Если кому-то интересно, устройство TTY представляет собой канал связи RS-232 с микроконтроллером. Информация не является конфиденциальной или защищенной. Все процессы (приложение и шпионы) могут запускаться от имени пользователя root.

Ответы [ 7 ]

3 голосов
/ 05 августа 2010

Рассматривали ли вы использование strace / ltrace ?Вы можете видеть системные вызовы, которые он выполняет, в частности, вы можете видеть, как выполняются вызовы write / ioctl и т. Д.

2 голосов
/ 05 августа 2010

RS-232 ? Просто нажмите на линии RxD / TxD / GND с помощью клипов. Это было навсегда, так как я видел, что любое устройство заботится о DCD, DTR и т. Д.

1 голос
/ 27 октября 2010

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

script открывает псевдо-терминал, а затем запускает другой экземпляр вашей оболочки с этой новой оболочкой в ​​качестве управляющего терминала (поэтому /dev/tty ссылается на этот псевдо-терминал для этой оболочки и ее дочерних процессов). Опция -c позволяет запускать определенную команду, а не оболочку.

Основная проблема с script состоит в том, что невозможно определить, каким образом проходили данные, захваченные в выходном файле (по умолчанию ./typescript) - потоки данных в обоих направлениях выводятся в один и тот же файл и выглядят одинаково к тому, что появляется на экране при использовании интерактивного терминала (за исключением включения побегов, возвратов каретки и таких глупых вещей, как обычно отображаемые символы).

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

1 голос
/ 05 августа 2010

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

1 голос
/ 05 августа 2010

Есть несколько альтернатив:

Сделай сам с GDB: Перенаправление вывода из запущенного процесса

CryoPID позволяет записывать состояние запущенного процесса в Linux и сохранять его в файл. Затем этот файл можно использовать для возобновления процесса позднее, либо после перезагрузки, либо даже на другом компьютере.

Распределенное многопоточное CheckPointing - инструмент для прозрачного контрольная точка состояния произвольной группы программ распространения на многих машинах и соединены розетками.

0 голосов
/ 07 августа 2010

Люди здесь уже сделали хорошие предложения, но вот другое:

Вы также можете написать общую библиотеку со своим собственным write(), который выполняет некоторую работу, прежде чем вызвать write() из libc.so.Затем вы можете использовать переменную окружения LD_PRELOAD для загрузки вашей библиотеки при запуске процесса.

0 голосов
/ 07 августа 2010

Не просто (по крайней мере, для меня), но механизм, который должен работать для драйверов последовательных tty, - это дисциплина линии .

...