Понимание sendfile () и splice () - PullRequest
       19

Понимание sendfile () и splice ()

7 голосов
/ 24 декабря 2011

sendfile() может использоваться для передачи данных из дескриптора «файл» в дескриптор «сокет» для передачи данных с компьютера A на компьютер B. Возможно ли получить данные на приемном конце от «дескриптор сокета к файлу с похожей семантикой нулевого копирования?Я думаю, что sendfile() здесь не поможет, потому что sendfile() нужен источник данных, чтобы быть кешем "страница / буфер".Правильно ли мое понимание?Может ли splice() помочь в этой ситуации?

1 Ответ

12 голосов
/ 24 декабря 2011

Вы правы насчет ограничения sendfile для этого. И да, splice может помочь, но это не тривиально: splice требует, чтобы хотя бы один из дескрипторов исходного или целевого файла был каналом. Таким образом, вы не можете напрямую splice из сокета в простой дескриптор файла.

Концептуально, что вы можете сделать, чтобы это заработало:

  • настройте свой входящий сокет fd и выходной файл fd, как обычно
  • создать трубу с pipe(2)
  • в цикле:
    • чтение из сокета на стороне записи канала с splice
    • запись со стороны чтения канала в файл с splice также

Повторяйте последние шаги, пока все данные не будут прочитаны.

Zero-Copy в Linux с sendfile () и splice () имеет реализацию этого метода.

...