Определение программ «до» и «после» в конвейере происходит из одного и того же «набора инструментов» - PullRequest
1 голос
/ 01 июля 2011

Скажем, я пишу некоторый набор инструментов, где каждый инструмент работает с одним и тем же потоком текстовых данных, анализирует его, выполняет с ним некоторые операции и возвращает текстовый поток обратно, используя тот же синтаксис, что и в исходном вводе. Инструменты могут быть объединены (вместе с другими инструментами Unix / скрипты / что угодно) в конвейере. Поскольку обработка текстового ввода (синтаксический анализ) довольно дорогая, я хотел бы избежать этого в случае два или более инструментов из набора инструментов находятся один за другим в конвейере и используют вместо этого бинарные потоки (для хранения непосредственно в структуре памяти, без бесполезного «дополнительного» разбора). Это можно узнать (используя какой-то трюк, межпроцессное взаимодействие или что-то еще), если инструмент "до" или "после" любой инструмент в конвейере является частью набора инструментов? Я думаю, unix env. не готов к такого рода "сигнализации" (AFAIK). Спасибо за ваши идеи ...

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

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

  • Иметь основную программу, которая принимает параметры для указания, какие инструменты запускать и в каком порядке, а затем запускать инструмент «разбора», затем запрашиваемые инструменты (все с использованием двоичного ввода-вывода), а затем инструмент «вывода». Не было бы очень сложно также выставить отдельные инструменты, обернутые инструментами разбора / вывода.
  • Если ожидается, что пользователи будут достаточно осведомлены, пусть каждый инструмент разрешает флаги сообщать им, что они ожидают двоичный ввод и дают двоичный вывод, так что пользователи могут связываться следующим образом:

    tool1 -o | tool2 -i -o | tool3 -i -o | tool4 -i
    

    где -o означает выдачу двоичного вывода, а -i означает принятие двоичного ввода.

1 голос
/ 28 июля 2011

Другим способом было бы, чтобы все инструменты читали текстовые или двоичные представления, возможно, обозначенные магическим числом в начале файла. И опция командной строки может выбрать выходной формат. В зависимости от использования может быть предпочтительным сделать двоичный файл значением «по умолчанию» и выбрать вывод текста с параметром.

prog0 -binout <input.file | prog1 -binout | prog2 >output.file

против

prog0 <input.file | prog1 | prog2 -txtout >output.file

Вам не нужно магическое число для текстового формата, если двоичное магическое число состоит из байтов не ASCII.

1 голос
/ 18 июля 2011

Вы, конечно, можете говорить о процессах в цепочке инструментов, но это требует немного работы. Одна идея состоит в том, чтобы каждый процесс в наборе инструментов использовал pgid (pgid для каждого процесса в конвейере один и тот же), чтобы определить имя разделяемой памяти, а затем записать свои pid и inode своих входных потоков в разделяемую память. Тогда каждый процесс в наборе инструментов будет знать другие процессы в конвейере, которые также находятся в конвейере. Если inode совпадают, они узнают, находится ли их сосед в наборе инструментов.

...