Я могу получить stdout/stderr отдельно и поддержать первоначальный порядок?

Существует много шаблонов разработки вне простых, которые используются в "реальном мире". Хороший пример Stackoverflow использует Образцовый Шаблон Контроллера Представления. Я использовал Фабрики классов многократно в проектах для моего работодателя, и я уже видел многих записанные проекты с помощью них также.

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

8
задан flashk 9 October 2009 в 19:20
поделиться

6 ответов

Я почти уверен, что это невозможно сделать, за исключением написания порожденной программы для записи в пакеты и добавления метки времени к каждому. Без этого вы обычно можете запланировать буферизацию в стандартной библиотеке дочернего процесса, поэтому к тому времени, когда они '

3
ответ дан 5 December 2019 в 23:15
поделиться

В большинстве реализаций stdout и stderr, которые я видел , stdout буферизуется, а stderr - нет. В основном это означает, что вам не гарантируется, что они будут в порядке даже при запуске программы в прямой командной строке.

http://en.wikipedia.org/wiki/Stderr#Standard_error_.28stderr. 29

Краткий ответ: нельзя гарантировать, что вы читаете строки в том же порядке, в каком они появляются в cmd.exe, потому что порядок, в котором они появляются в cmd.exe, не гарантируется.

2
ответ дан 5 December 2019 в 23:15
поделиться

Не совсем так, вы так думаете, но std_out находится под контролем разработчиков системы - именно то, как и когда будет написано std_out, зависит от системного планировщика, который, по моему тестированию, подчиняется вопросам, которые не так документированы.

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

Повторное инвертирование этого кода для получения последовательного упорядочивания записи будет, по меньшей мере, сложной задачей.

0
ответ дан 5 December 2019 в 23:15
поделиться

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

0
ответ дан 5 December 2019 в 23:15
поделиться

Вы можете перенаправить stderr на стандартный вывод:

имя_команды 2> & 1

Насколько я помню, это возможно в C с использованием каналов.

ОБНОВЛЕНИЕ: Ой, извините - пропустил часть о способности различать эти два. Я знаю, что TextMate каким-то образом сделал это, используя своего рода код, видимый пользователем ... Давно не искал, но я посмотрю. Но после некоторых дополнительных размышлений можно ли использовать что-то вроде Open3 в Ruby? Вам нужно будет смотреть как STDOUT , так и STDERR одновременно, но на самом деле никто не должен ожидать определенного порядка вывода в отношении этих двух.

ОБНОВЛЕНИЕ 2: Пример то, что я имел в виду в Ruby:

require 'open3'

Open3.popen3('ruby print3.rb') do |stdin, stdout, stderr|
  loop do
    puts stdout.gets
    puts stderr.gets
  end
end

... где print3.rb просто:

loop do
  $stdout.puts 'hello from stdout'
  $stderr.puts 'hello from stderr'
end

Вместо того, чтобы бросать вывод прямо в put , вы можете отправить сообщение наблюдателю, который распечатает его в вашей программе. Извините, у меня нет Windows на этой машине (или какой-либо другой, доступной сейчас), но я надеюсь, что это иллюстрирует концепцию.

0
ответ дан 5 December 2019 в 23:15
поделиться

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

Как объяснялось ранее, записывайте каждый записанный фрагмент с отметкой времени и используйте это для восстановления последовательности, фактически наблюдаемой устройствами вывода. .

0
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: