Как вы решаете проблемы с именованными каналами? - PullRequest
0 голосов
/ 20 марта 2009

У меня есть двоичная программа *, которая берет содержимое предоставленного файла, обрабатывает его и выводит результат на экран через стандартный вывод. Для сценария автоматизации я хотел бы использовать именованный канал для отправки данных в эту программу и обработки выходных данных самостоятельно. После попытки заставить скрипт работать, я понял, что есть проблема с бинарной программой, принимающей данные из именованного канала. Чтобы проиллюстрировать проблему, я наметил несколько тестов с использованием оболочки Unix.

  1. Легко показать, что программа работает путем обработки файла фактических данных.

    $ binprog file.txt > output.txt
    

    В результате будет получен файл output.txt, содержащий обработанную информацию из файла file.txt.

  2. Именованный канал (pipe.txt) работает так, как видно из этой демонстрации.

    $ cat pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    

    Это приведет к тому, что output.txt будет содержать данные из file.txt после их отправки по каналу.

  3. Когда двоичная программа читает файл из именованного канала, а не из файла, все работает неправильно.

    $ binprog pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    

    В этом случае output.txt не содержит данных даже после завершения работы cat и binprog. Используя top и ps, я вижу, что binprog "работает" и, похоже, выполняет свою работу. Все выполняется без ошибок.

Почему в этом третьем примере binprog не производит вывод?

Какие вещи я мог бы попытаться заставить это работать?

[*] Рассматриваемая программа имеет размер svm от libsvm . Я решил обобщить примеры, чтобы они были простыми и понятными.

Ответы [ 3 ]

3 голосов
/ 20 марта 2009

Вы уверены, что программа будет работать с каналом? Если ему нужен произвольный доступ к входному файлу, он не будет работать. Программа будет выдавать ошибку всякий раз, когда будет пытаться выполнить поиск во входном файле.

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

binprog <(cat file.txt) > output.txt
1 голос
/ 20 марта 2009

binprog также принимает ввод на стандартный ввод? Если это так, это может сработать для вас.

cat pipe.txt | binprog > output.txt
cat file.txt > pipe.txt

Редактировать: Кратко отсканировал справочную страницу для svm-масштаба. Дайте этому вихрь вместо этого:

cat pipe.txt | svm-scale - > output.txt
0 голосов
/ 20 марта 2009

Если binprog не работает должным образом с чем-либо, кроме терминала, в качестве входа, возможно, вам нужно дать ему (псевдо) терминал (pty) для его входа. Это сложнее организовать, но программа expect - это один из способов сделать это относительно легко. Есть обсуждения программирования с pty в Расширенное программирование в среде Unix, 3-е издание У Ричарда Стивенса и Стивена Раго, и в Расширенное программирование в Unix, 2-е издание Марка Рочкинда.

Что еще нужно посмотреть, это вывод truss или strace или локальный эквивалент. Эти программы регистрируют все системные вызовы, сделанные процессом. На Солярисе я бы запустил:

truss -o binprog.truss binprog

в интерактивном режиме, и посмотрите, что он делает. Затем я попробовал бы это с перенаправлением ввода / вывода, а затем с перенаправлением ввода / вывода из именованного канала; могут быть некоторые существенные различия между тем, что он делает, или вы можете увидеть системный вызов, который зависает. Если вы видите вилки в файле журнала фермы, вам нужно добавить флаг '-f', чтобы следовать за дочерними элементами.

...