Как захватить небуферизованный вывод из стандартного вывода без изменения программы - PullRequest
3 голосов
/ 11 октября 2009

Я пишу утилиту для запуска программ, и мне нужно захватить небуферизованные stdout и stderr из программ. Мне нужно:

  • Захват stdout и stderr в отдельные файлы.
  • Вывод не должен буферизироваться (или быть буферизованным строкой).
  • Без изменения источника запускаемой программы.

Проблема заключается в том, что при передаче вывода в файл поток stdout становится буферизованным блоком, а не буферизованным строкой. Если программа дает сбой, вывод никогда не сбрасывается и остается пустым. Поэтому мне нужно захватить стандартный вывод без буферизации (или с буферизацией строки).

Я думаю, что это можно сделать с помощью pty, но мне трудно найти примеры, которые делают именно то, что я хочу (большинство игнорирует stderr). На самом деле, я не уверен, что нашел какие-либо pty примеры в C; большинство из них используют высокоуровневый интерфейс, такой как pty и подпроцессные модули Python.

Может кто-нибудь помочь (с фрагментами кода или ссылками)? Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Я думаю, что я решил это. Следующие две ссылки были очень полезны.

Мой код доступен в качестве хранилища:

1 Ответ

2 голосов
/ 11 октября 2009

см. man 7 pty


В частности:

псевдо-терминалы Unix 98

Неиспользуемый псевдо-терминал Unix 98 открывается с помощью вызова posix_openpt(3). (Эта функция открывает главное устройство-клон, /dev/ptmx; см. pts(4).) После выполнения любых инициализаций, специфичных для программы, изменение владельца и разрешений ведомого устройства с помощью grantpt(3) и разблокировки ведомого с помощью unlockpt(3)), соответствующего ведомое устройство можно открыть, передав имя, возвращенное ptsname(3) при звонке на open(2).

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

  • Посмотрите их справочные страницы
  • Google для примера кода. Поскольку вы знаете, какие ключевые слова использовать в поисковой системе, я подозреваю, что вам будет гораздо больше удачи в поиске примеров.
...