Quiero copiar datos de un flujo a otro. Ahora normalmente, lo haría de esta manera:
n = fread(buffer, 1, bufsize, fin); fwrite(buffer, 1, n, fout); ¿Hay alguna manera de escribir los datos directamente de fin a fout , sin pasar por un búfer, es decir, en lugar de fin->buffer->fout , quiero hacer directamente fin->fout (sin búfer)?
¿Es posible hacerlo en ANSI C? Si no, ¿es posible hacerlo con funciones POSIX? ¿O una solución específica de Linux?
2 posibles soluciones solo para Linux son splice() y sendfile() . Lo que hacen es copiar datos sin dejar espacio en el núcleo, lo que hace una optimización de rendimiento potencialmente significativa.
Tenga en cuenta que ambos tienen limitaciones :
sendfile() requiere un socket para su salida para kernels de Linux antes de 2.6.33, después de eso, cualquier archivo puede ser la salida, y también requiere la entrada para admitir operaciones mmap() , lo que significa que la entrada no puede ser stdin o un tubo.
splice() requiere que uno de los flujos de entrada o salida sea una tubería (no estoy seguro de ambos), y también para las versiones del kernel 2.6.30.10 y anteriores, requiere el sistema de archivos para la transmisión que no es una tubería para admitir el empalme.
Editar: tenga en cuenta que es posible que algunos sistemas de archivos no admitan el empalme para Linux 2.6.30.10 y versiones anteriores .