2010-08-13 25 views
9

lectura (2) y escritura (2) funciona tanto en el descriptor de socket como en el descriptor de archivo. En caso de descriptor de archivo, tabla de descriptor de archivo de usuario-> tabla de archivos y finalmente a la tabla de inode donde comprueba el tipo de archivo (archivo/char/bloque normal) y lee en consecuencia. En el caso del archivo char spl, obtiene los punteros de función basados ​​en el número principal del archivo desde el interruptor de dispositivo char y llama a las rutinas de lectura/escritura apropiadas registradas para el dispositivo. De manera similar, se requiere una rutina de lectura/escritura para el archivo especial de bloques obteniendo los punteros de función del interruptor del dispositivo de bloques.descriptor de socket vs descriptor de archivo

Podrías decirme qué sucede cuando se lee/escribe en el descriptor de socket. Si la lectura/escritura funciona en el descriptor de socket, ¿no podemos usar open en lugar de socket para obtener el descriptor?

+0

no se puede saber exactamente ** ** lo que sucede (intente buscar en el código fuente del núcleo si realmente quiere saber), pero esencialmente se pasará la solicitud al controlador TCP, que pasará más abajo en la pila de red hasta que llegue al controlador de la tarjeta de interfaz de red. Si desea saber qué hace cada capa de la pila de red en términos generales, busque el * modelo OSI *. En cuanto a 'abrir' vs' socket': toman diferentes argumentos, ya que la información que debe especificarse es diferente dependiendo de si desea abrir un archivo o un socket. – David

+0

Quiero saber cuál es la estructura de datos asignada al socket de llamada(), qué información está almacenada en la tabla de inode, cómo llega a las rutinas del controlador de la tarjeta de interfaz de red al llamar a lectura/escritura –

+0

Nota leer/escribir envuelve la llamada del sistema. La mayor parte del trabajo se realiza en el espacio del kernel. que es una especie de abstracción, o "virtualización": simplemente tome el archivo de bloque, el socket u otras muchas cosas, como "archivo". un archivo tiene operaciones como leer, escribir, abrir, etc. Pero la implementación real de leer un socket o leer un archivo de disco está definida en kernel. Incluso puede definir la "escritura" para leer del archivo si lo necesita. – tristan

Respuesta

2

Los descriptores de socket también están asociados con las estructuras de archivos, pero un conjunto de funciones file_operations para esas estructuras difiere de lo habitual. La inicialización y el uso de esos descriptores son, por lo tanto, diferentes. La parte de lectura y escritura de la interfaz del kernel resultó ser exactamente equivalente.

+0

Quiero saber cuál es la estructura de datos asignada al zócalo de llamada(), qué información está almacenada en la tabla de inode, cómo llega a las rutinas del controlador de la tarjeta de interfaz de red al llamar a lectura/escritura –

+0

no sucedió, deliberadamente se hizo idéntico – Yerken

0

leer y escribir son válidos para algunos tipos de sockets en algunos estados; todo esto depende de las diversas estructuras que se pasan dentro del kernel.

En principio, open() podría crear un descriptor de socket, pero la API de sockets BSD nunca se definió de esa manera.

Existen algunos otros tipos de descriptor de archivo (algo linux específicos) que se abren mediante llamadas al sistema distintas de open(), por ejemplo epoll_create o timerfd_create. Estos funcionan igual.

6

Como sé en memoria, el descriptor de archivo contendrá el indicador para identificar el tipo de sistema de archivos de este fd. El núcleo invocará la función del controlador correspondiente depende del tipo de sistema de archivos. Puede ver la fuente read_write.c en el kernel de Linux.

Ser hablar en breve, el núcleo hizo:

  1. En-write.c leer, hay una función file_system_wrapper, que la función de gestor de llamadas correspondiente depende del tipo de archivo de fd (ext2/ext3/hembra/..)
  2. En socket.c, hay una función socket_type_wrapper; que llama a la función del manejador de socket correspondiente depende del tipo de socket (ipv4, ipv6, atm otros)
  3. En socket_ipv4.c, hay una función de contenedor protocol_type; que llama a la función del manejador de protocolo correspondiente depende del protocolo tpye (udp/tcp)
  4. En tcp_ip4.c; hay tcp_sendmsg y se llamaría a esta función cuando escriba en FD del tipo tcp ipv4.

Hope esto claramente, gracias , Houcheng

Cuestiones relacionadas