правильное связывание подпроцессов Popen

У меня есть такая конструкция:

os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])

здесь cap - это процесс, который обычно записывает в файл (указанный в -f ), но я могу заставить его выводить данные на экран, указав / dev / stdout ] как выходной файл. аналогично, enc ожидает чтения из файлового объекта, и я могу заставить его читать из канала, указав - в качестве входных данных. поэтому вместо использования именованного канала в операционной системе, я подумал, что специальный файл может не понадобиться, я могу использовать безымянный канал вроде этого ..

cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()

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

  1. является ли / dev / stdout , с которым общается cap , отличным от фактического stdout в ОС? то есть с входным конвейером - в enc получу ли я чистый канал данных между этими двумя процессами, даже если другие процессы общаются с / dev / stdout в ОС?
  2. Будут ли какие-либо существенные различия в поведении при блокировке / постановке в очередь?Я думаю, что в моем первом примере именованный канал будет буферизованным 4096 байтов и будет блокироваться на любом конце, если cap / enc не будет писать / читать достаточно быстро, но поправьте меня если я ошибаюсь.
  3. требуется ли какой-либо особый порядок порождения или завершения, или какие-либо другие ошибки, о которых я должен знать?
7
задан wim 11 July 2011 в 07:23
поделиться