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

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

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

  • Создание множества файлов со случайным контентом
  • Неизвестный тип файла в ls
  • Как добавить атрибут в тег в файле XML по командной строке?
  • Временная отметка файла на установленном диске показывает 1 час отставания
  • Почему sed так быстро?
  • Объединение последовательных файлов
  • Список всех файлов, отображающих типы файлов.
  • Как создать списки прав на папки для каждого пользователя?
  • Не удается поймать создание файла с помощью strace
  • бит-OR 2 двоичные файлы
  • Как удалить 2 месяца назад файлы в 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 .

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