Каковы различия между трубами в 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 таких вещей просто невозможно. Механизмы МПК совершенно разные.

Ответ 4

Еще одно важное отличие

В окнах

A | B | C 

До тех пор, пока A не будет завершено, вывод B не начнет считываться. То же самое для вывода B, считанного C

* nix захватывает вход и выход вместе, так что C может считывать вывод B, а B может читать вывод A, пока A и B все еще работают

Пропускная способность примерно такая же, но вывод быстрее с помощью * nix.