Каковы различия между трубами в Windows и Linux?
Каковы различия между каналами в Windows и Linux?
Ответы
Ответ 1
Единственное отличие, о котором я знаю, это то, что именованные каналы под Linux - это фактические записи в файловой системе (вы увидите их в списке каталогов, у них есть специальный тип), тогда как в Windows они хранятся в каком-то волшебном хранилище (все они доступны по пути "\\.\pipe \".
Во-вторых, в Linux вы можете просто писать/читать из труб, как если бы они были любым другим файлом, используя стандартные методы ввода-вывода. Если в окнах вы должны использовать специальные функции "Pipe", которые являются частью Win32 API.
Мне нравится linux-метод лучше, потому что он позволяет мне использовать каналы с любым приложением, которое я хочу. Например:
mkfifo pipe.wav
decodeMP3 song.mp3 --out pipe.wav &
encodeAVI video.mpeg pipe.wav --out video.avi
Это позволяет мне выводить вывод декодера MP3 непосредственно в видеодекодер, вместо того чтобы сначала декодировать весь MP3 в WAV файл на диске. Это удобно, если у вас двухъядерный процессор, потому что тогда вы запускаете обе операции сразу, для приятного ускорения.
Ответ 2
В Linux (и * ix вообще), "все - файл". Вы можете читать/писать/искать трубы и сокеты и устройства без каких-либо ограничений, поскольку эти операции имеют смысл.
В то время как Windows имеет гораздо менее унифицированную архитектуру для этих различных типов объектов. Хотя я не мог рассказать вам подробности, я знаю, что буферизация труб значительно отличается между Windows и Linux, поэтому вы можете столкнуться с трудностями.
Кроме того, одно распространенное использование Unix-y труб - это fork()
подпроцесс, а затем связь с ним через канал (родительский открывает один конец, дочерний открывает другой конец). В Windows таких вещей просто невозможно. Механизмы МПК совершенно разные.
Ответ 3
См. также предыдущий поток:
Как называются каналы?
Что содержит мой прием и несколько других народов
Ответ 4
Еще одно важное отличие
В окнах
A | B | C
До тех пор, пока A не будет завершено, вывод B не начнет считываться. То же самое для вывода B, считанного C
* nix захватывает вход и выход вместе, так что C может считывать вывод B, а B может читать вывод A, пока A и B все еще работают
Пропускная способность примерно такая же, но вывод быстрее с помощью * nix.