Являются файлами UNIX для интернет-сокетов?

Я понимаю, что «Все является файлом» является одной из основных концепций Unix, но сокеты используют разные API, которые предоставляются ядром (например, socket, sendto, recv и т. Д.), А не обычные интерфейсы файловой системы.

Как это «все есть файл» применяется здесь?

  • Использует ли потоки все еще считающиеся анти-шаблонами?
  • Почему по умолчанию umask - 002 или 022 во многих Unix-системах? Кажется неубедительным по умолчанию
  • Как Node.js / модуль кластера передает новые соединения из процесса master / parent, дочерних процессов?
  • Можно ли использовать сокет, если его файл доступен только для чтения?
  • Почему sort -o полезен?
  • В чем смысл содержимого / proc / net / unix?
  • Как сообщить размер очереди приема для сокетов AF_UNIX
  • Не удается запустить приложения из-за ошибки «Максимальное количество клиентов»
  • 4 Solutions collect form web for “Являются файлами UNIX для интернет-сокетов?”

    сокеты используют разные API

    Это не совсем так. Существуют некоторые дополнительные функции для использования с сокетами, но вы можете использовать, например, обычные функции read() и write() на сокете fd.

    как это «все есть файл» применяется здесь?

    В том смысле, что задействован дескриптор файла.

    Если ваше определение «файл» представляет собой дискретную последовательность байтов, хранящихся в файловой системе, то не все это файл. Однако, если ваше определение файла более похоже на дескриптор – канал для информации, т. Е. Соединение ввода-вывода – тогда «все является файлом» начинает иметь больше смысла. Эти вещи неизбежно включают последовательности байтов, но там, где они происходят или идут, могут различаться контекстно.

    Однако это не значит буквально. Демон – это не файл, демон – это процесс; но если вы выполняете IPC, ваш метод связи с другим процессом может быть смягчен объектами стиля файла.

    «Все – файл» – это просто преувеличение. Это был роман в 1970-х годах, и он был основным отличительным признаком UNIX. Но это всего лишь маркетинговая концепция, а не реальная основа UNIX, потому что это, очевидно, не так. Не полезно или разумно рассматривать ВСЕ как файл.

    Является ли CPU файлом? Ваша программа считывает () процессор для получения новой инструкции? Является ли RAM файлом? Ваша программа читает () следующий байт?

    В то время существовали виды ОС, которые предоставили вам один API для гибкого диска и другой API для жесткого диска, другой API для магнитной ленты и множество различных API для разных терминалов и т. Д. Системы мейнфреймов IBM имели разные типы файлов на жестких дисках и предоставляли вам разные API для каждого из них, верьте или нет! Таким образом, подход UNIX «это файл», а также подход «stdin / stdout / stderr» принесли очень элегантную абстракцию как пользователям, так и программистам.

    С сетью эта конкретная абстракция просто не сработала. И нет никакого вреда, чуть меньше общей элегантности и согласованности ОС. Но это работает. Вы видите файл под названием /dev/myinternetz/www/google/com/tcp/80 любой точке вашей системы сегодня? Можете ли вы открыть () его, написать () запрос и прочитать () ответ в хорошем HTML? Нет? Это связано с тем, что абстракция «является файлом» не очень удобна для взаимодействия по сети. На практике это не будет работать слишком хорошо. Закон протекающих абстракций в действии.

    Если вы stat сокет, вы увидите, что он имеет номер inode и другие характеристики обычных файлов, поэтому я бы классифицировал его как файл в файловой системе. Пример:

     # file live live: socket # stat live File: `live' Size: 0 Blocks: 0 IO Block: 4096 socket Device: fc03h/64515d Inode: 198817 Links: 1 Access: (0660/srw-rw----) Uid: (23129/ icinga) Gid: (23130/icinga-cmd) Access: 2014-11-07 09:27:59.000000000 -0800 Modify: 2014-11-05 09:27:03.000000000 -0800 Change: 2014-11-05 09:27:03.000000000 -0800 

    11/17. Дополнительная информация для Linux (ext3): Сокет имеет индексный дескриптор (который является 256-байтовым блоком на диске), но не имеет блоков данных (вы можете это проверить, извлекая индексный индекс и исследуя указатели блока данных или запускает debugfs 'stat', который показывает Blockcount из 0). Таким образом, у него есть метаданные файлов (владелец, группа, разрешения и т. Д.), Но нет содержимого данных на диске. Это совпадает с обычным пустым файлом ( touch /tmp/foo ), который также имеет номер кадра 0. В первом случае поле «type» в inode показывает «socket»; во втором случае он показывает «обычный файл».

    Ссылки: внешняя структура ext2 ; stat , dumpe2fs и debugfs .

    Сокеты – это файлы. Вы можете использовать read и write в сокете: они эквивалентны вызову recv и send with flags=0 . Вы закрываете их close . Вы можете перемещать их с помощью dup и друзей, если вам нужно перетасовать файловые дескрипторы. Вы можете установить несколько флагов с помощью fcntl и использовать буферизацию stdio после вызова fdopen . Список можно продолжить. Очень важно, что вы можете вызывать select и poll для любого типа файлов, включая сокеты, поэтому эти функции позволяют программе блокировать до тех пор, пока он не получит вход с помощью каких-либо средств, просто перечисляя дескрипторы файлов.

    Существуют дополнительные системные вызовы для некоторых типов сокетов ( recv и send , shutdown и т. Д.), Например, есть дополнительный системный вызов для устройств ( ioctl ).

    Не у всех файлов есть имена , а у тех, которые это делают, они не всегда живут в структуре каталогов. Трубы, созданные pipe (например, в конвейере оболочки) и сокеты, созданные socketpair , не имеют имен, но они все еще являются файлами. Сокеты, созданные socket имеют имя, синтаксис которого зависит от домена. Это имя передается в struct sockaddr для bind и других функций. Для сокета Unix ( AF_UNIX ) имя представляет собой struct sockaddr_un , которая является семейством и строкой; в зависимости от строки это может быть имя файла (так называемые сокеты могут быть созданы с mknod во многих вариантах unix) или нет (абстрактное пространство имен). Для сокета IPv4 ( AF_INET ) имя представляет собой struct sockaddr_in , содержащий номер порта и IP-адрес, а также protocol из вызова socket .

    Interesting Posts

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

    Как использовать только автоматическую сборку RAID-массивов на Ubuntu?

    Файл базы данных пакета на Solaris 10

    Как я могу перечислить все сокеты, которые открыты для удаленных компьютеров?

    OpenSUSE – Ethernet-адаптер, но не может пинговать маршрутизатор

    Как увидеть / определить размер файла на диске в Linux?

    Не удалось загрузить новую установку FreeBSD 8.2 на Intel SS4200-EHW

    Как я могу проанализировать ini-файл, чьи значения могут содержать определенные символы?

    openvpn –config conf.ovpn приводит к ответам «RTNETLINK: файл существует»

    Сделать mount not list «фиктивными» файловыми системами (например, df)

    С mv, можно установить временную зависимость от файлов mv'ed?

    Как изменить порядок большого количества столбцов?

    ssh tunnel w / auth только для прокси

    Что использовать вместо `buffer` для 1GB-буфера?

    Конфигурация GTK + 3 Arch / LXDE

    Linux и Unix - лучшая ОС в мире.