Мне разработало процесс 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 на микроконтроллер. Информация не является уязвимой или защищена. Все процессы (приложение и шпионы) могут работать как корень.
Вы можете посмотреть slsnif . Он делает именно то, что вы хотите, или, если вы хотите написать его самостоятельно, доступен исходный код, чтобы увидеть, как это работает.
Непростой (по крайней мере, для меня), но механизм, который должен работать для последовательных драйверов tty, - это дисциплина линии .
Есть несколько альтернатив:
Сделай сам с GDB: Перенаправление вывода из запущенного процесса
CryoPID позволяет фиксировать состояние запущенного процесса в Linux и сохранять его в файл. Затем этот файл можно использовать для возобновления процесса позже, либо после перезагрузки, либо даже на другом компьютере.
Распределенная многопоточная контрольная точка - это инструмент для прозрачного контрольная точка состояния произвольной группы программ, распространяемых на многих машинах и соединены розетками.
Думали ли вы об использовании strace / ltrace ? Вы можете видеть выполняемые системные вызовы, в частности, вы можете видеть выполняемые вызовы write / ioctl и т. Д.
Здесь люди уже сделали хорошие предложения, но вот еще одно:
Вы также можете написать общую библиотеку с помощью собственной write ()
, которая выполняет некоторую работу перед вызовом write ()
из libc.so
. Затем вы можете использовать переменную среды LD_PRELOAD
для загрузки вашей библиотеки при запуске процесса.
RS-232 ? Просто коснитесь линий RxD / TxD / GND зажимами. Я давно не видел ни одного устройства, которое заботилось бы о DCD, DTR и т. Д.