2011-12-24 22 views
6

sendfile() se puede utilizar para transmitir datos de un descriptor de "archivo" a un descriptor de "zócalo" para obtener datos de la máquina A a la máquina B. ¿Es posible obtener los datos en el extremo receptor desde el descriptor de "socket" a un archivo con semántica de copia cero similar? Creo que sendfile() no ayuda aquí porque sendfile() necesita que la fuente de datos sea el caché "page/buffer". Es mi entendimiento correcto? ¿Puede splice() ayudar en esta situación?Entender sendfile() y empalme()

Respuesta

11

estás en lo correcto acerca de la limitación de sendfile para esto. Y sí, splice puede ayudar, pero no es trivial: splice requiere que al menos uno de los descriptores de archivos de origen o destino sea un conducto. Por lo tanto, no puede directamente splice desde un socket a un descriptor de archivo simple.

Conceptualmente, lo que puede hacer para que funcione es:

  • configurar su fd toma de entrada y de su archivo fd de salida como lo haría normalmente
  • crear un tubo con pipe(2)
  • en un bucle :
    • lectura de la toma de la parte de escritura de la tubería con splice
    • escritura desde el lado de lectura de la tubería a tH archivo electrónico con splice también

Repita los últimos pasos hasta que se lee todos los datos.

Zero-Copy in Linux with sendfile() and splice() tiene una implementación de esta técnica.

+3

Desde el 2.6.33 out_fd para sendfile puede ser cualquier descriptor de archivo (no sólo enchufes). – ldrg

+1

desde 4.2 lo mismo aplica para 'empalme()' – technosaurus