Я нашел пару ответов, но они, похоже, относятся к машинам Windows. Поэтому мой вопрос в том, каковы различия между трубами и сокетами, и когда/как вы должны выбирать один за другим?
Какая разница между трубами и сокетами?
Ответ 1
Каковы различия между трубами и сокетами, и когда/как вы должны выбирать один из них?
Оба канала и сокеты обрабатывают байтовые потоки, но они делают это по-разному...
- существуют только в пределах определенного хоста, и они относятся к буферизации между виртуальными файлами или подключению вывода/ввода процессов внутри этого хоста. Внутри труб нет понятий пакетов.
- сокеты пакетируют связь с использованием IPv4 или IPv6; эта связь может выходить за пределы локального хоста. Обратите внимание, что разные конечные точки сокета могут совместно использовать один и тот же IP-адрес; однако для этого они должны прослушивать разные порты TCP/UDP.
Использование:
- Использовать трубы:
- когда вы хотите читать/записывать данные в виде файла на определенном сервере. Если вы используете C, вы
read()
иwrite()
в трубе. - когда вы хотите подключить вывод одного процесса к вводу другого процесса... см. popen()
- когда вы хотите читать/записывать данные в виде файла на определенном сервере. Если вы используете C, вы
- Используйте сокеты для отправки данных между различными конечными точками IPv4/IPv6. Очень часто это происходит между разными хостами, но сокеты могут использоваться внутри одного и того же хоста.
Кстати, вы можете использовать netcat или socat, чтобы присоединиться к сокету к каналу.
Ответ 2
Чтобы выполнить ответ, данный Майком, важно упомянуть о существовании сокетов домена UNIX, доступных в любой совместимой с POSIX операционной системе. Хотя они очень похожи на "обычные" интернет-сокеты с точки зрения семантики использования, они являются чисто локальными для машины (конечно, интернет-сокеты также работают локально) и, таким образом, почти ведут себя как труба. Почти потому, что UNIX-канал по определению является однонаправленным:
Трубы и FIFO (также известные как именованные каналы) обеспечивают однонаправленную межпроцессный канал связи. Труба имеет конец считывания и запись конец. Данные, записанные на конец записи трубы, могут быть считаны из прочитанного конец трубы. (выдержка из man page pipe (7))
У сокетов домена UNIX также есть очень необычная функция, так же как и данные, они также позволяют отправлять дескрипторы файлов: таким образом, непривилегированный процесс может получить доступ к любому файлу, дескриптор которого был отправлен через сокет. Этот метод, согласно Википедии, используется демоном антивирусного сканирования ClamAV.