Гарантия того, что каждая линия получена полностью от нескольких ТРУБ (STDOUT) - PullRequest
1 голос
/ 16 августа 2010

Я спросил на днях, сохраняется ли целостность данных (сброшенных данных), даже если в STDIN локального хоста передается более одной PIPE.Ответ НЕТ, если сброшенные данные большие. Вопрос целостности данных при сборе STDOUT с нескольких удаленных хостов по SSH

Но я хотел бы гарантировать, что каждая строка, очищенная на каждом конце, полностью передается одному STDIN и не будет смешиватьсяс данными из других каналов.Есть ли способ сделать это?Как это можно сделать?

(Обратите внимание, что это можно сделать, если я создаю несколько STDIN локально. Но более удобно, если я могу обрабатывать потоки строк через один STDIN. Поэтому мой вопрос сосредоточен на том случае, когдана локальном узле есть только один STDIN с несколькими (STDOUT) трубами.)

1 Ответ

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

Это можно сделать с помощью системы защиты от перегрузки, аналогичной той, которая используется в Ethernet.

Сначала присвойте каждой трубе уникальный разделитель. Этот разделитель не может появляться без содержимого в любой трубе. Теперь используйте следующий псевдокод:

  • Проверить разделитель другого процесса; пока присутствует нечетное число разделителей одного другого процесса, подождите.
  • Написать символ-разделитель.
  • Проверьте, не написал ли другой процесс несоответствующий разделитель. Если это так, отмените случайное (увеличивающееся) количество и вернитесь к первому шагу.
  • Запись данных.
  • Написать символ-разделитель.

Это гарантирует, что, хотя у вас будет немного мусора, каждое целое сообщение в конечном итоге пройдет.

...