Вы правы насчет ограничения sendfile
для этого. И да, splice
может помочь, но это не тривиально: splice
требует, чтобы хотя бы один из дескрипторов исходного или целевого файла был каналом. Таким образом, вы не можете напрямую splice
из сокета в простой дескриптор файла.
Концептуально, что вы можете сделать, чтобы это заработало:
- настройте свой входящий сокет fd и выходной файл fd, как обычно
- создать трубу с
pipe(2)
- в цикле:
- чтение из сокета на стороне записи канала с
splice
- запись со стороны чтения канала в файл с
splice
также
Повторяйте последние шаги, пока все данные не будут прочитаны.
Zero-Copy в Linux с sendfile () и splice () имеет реализацию этого метода.