дескриптор сокета или дескриптор файла - PullRequest
11 голосов
/ 13 августа 2010

read (2) и write (2) работают как с дескриптором сокета, так и с дескриптором файла. В случае дескриптора файла: Таблица дескриптора файла пользователя-> таблица файлов и, наконец, таблица индексов, где она проверяет тип файла (обычный файл / символ / блок) и читает соответственно. В случае файла char spl он получает указатели функций на основе основного номера файла от переключателя char char и вызывает соответствующие подпрограммы чтения / записи, зарегистрированные для устройства. Аналогичным образом соответствующая процедура чтения / записи вызывается для специального блочного файла путем получения указателей на функции от переключателя блочного устройства.

Не могли бы вы дать мне знать, что именно происходит, когда чтение / запись вызывается в дескрипторе сокета. Если чтение / запись работает с дескриптором сокета, мы не можем использовать открытый вместо сокета, чтобы получить дескриптор?

Ответы [ 3 ]

10 голосов
/ 11 декабря 2012

Как я знаю в памяти, дескриптор файла будет содержать флаг для идентификации типа файловой системы этого fd. Ядро вызовет соответствующую функцию-обработчик в зависимости от типа файловой системы. Вы можете увидеть исходный код read_write.c в ядре Linux.

Если говорить кратко, ядро ​​сделало:

  1. В read-write.c есть функция file_system_wrapper, которая вызывает соответствующую функцию-обработчик в зависимости от типа файла fd (ext2 / ext3 / socket / ..)
  2. В socket.c есть функция socket_type_wrapper; которая вызывает соответствующую функцию обработчика сокета, зависит от типа сокета (ipv4, ipv6, atm others)
  3. В socket_ipv4.c есть функция-обертка protocol_type; которая вызывает соответствующую функцию обработчика протокола, зависит от протокола tpye (udp / tcp)
  4. В tcp_ip4.c; существует tcp_sendmsg, и эта функция вызывается при записи в FD типа tcp ipv4.

Надеюсь, это ясно, Спасибо, Houcheng

3 голосов
/ 13 августа 2010

Дескрипторы сокетов также связаны с файловыми структурами, но набор функций file_operations для этих структур отличается от обычного. Поэтому инициализация и использование этих дескрипторов различны. Чтение и запись части интерфейса уровня ядра просто оказались абсолютно эквивалентными.

0 голосов
/ 13 августа 2010

чтение и запись действительны для некоторых типов сокетов в некоторых состояниях;все это зависит от различных структур, которые передаются внутри ядра.

В принципе, open () может создать дескриптор сокета, но API сокетов BSD никогда не определялся таким образом.

Существуют некоторые другие (несколько специфичные для linux) типы файловых дескрипторов, которые открываются системными вызовами, отличными от open (), например epoll_create или timerfd_create.Они работают одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...