2012-07-10 68 views
8

Actualmente estoy escribiendo una función de devolución de llamada en C:¿Cuáles son las principales diferencias entre fwrite y write?

static size_t writedata(void *ptr, size_t size, size_t nmemb, void *stream){ 

     size_t written = fwrite(ptr, size, nmemb, (FILE)*stream); 
     return written; 
} 

Esta función se va a utilizar en otra función, que hace una solicitud HTTP, recupera la solicitud, y lo escribe en la máquina local. Esa función writedata se usará para la parte posterior. Toda la operación tiene que ser multithreaded, por lo que tuve dudas entre write y fwrite. ¿Podría alguien ayudarme a delinear las diferencias entre write() y fwrite() en C, para poder elegir cuál se ajusta mejor a mi problema?

Respuesta

16

fwrite escribe en un FILE*, es decir, un stdio flujo (potencialmente) en el búfer. Está especificado por el estándar ISO C. Además, en sistemas POSIX, fwrite is thread-safe hasta cierto punto.

write es una API de nivel inferior basada en los descriptores de archivos, descritos en el estándar POSIX. No sabe sobre el almacenamiento en búfer. Si desea utilizarlo en un FILE*, busque su descriptor de archivo con fileno, pero asegúrese de bloquear y enjuagar manualmente la secuencia antes de intentar un write.

Use fwrite a menos que sepa lo que está haciendo.

+3

Una cosa a tener en cuenta, sin embargo, es que * probablemente * no debería acceder a una estructura FILE * (que incluye, pero no se limita a, llamar a fread/fwrite) desde múltiples subprocesos, mientras que generalmente es más seguro hacerlo con descriptores de archivos de bajo nivel ... pero todavía no es una buena idea sin alguna sincronización :) – snemarch

1

La función write es una llamada que realiza su programa al sistema operativo y, por lo tanto, es más lenta que fwrite. También carece de buffering que lo hace incluso más lento porque como la filosofía del almacenamiento en búfer sugiere: "Es más rápido manejar muchas porciones de archivos pequeños en lugar de uno grande". También es importante que write no forme parte del estándar c, por lo que probablemente no lo encuentre en sistemas que no sean POSIX y (rara vez) el uso adecuado diferirá. También debe saber que fwrite y fread algunas veces se implementan usando write y read (se puede encontrar una implementación simple en el capítulo sobre Unix de K & R).

Otra cosa notable es que read y write uso file descriptors, pero fread y fwrite utilizan los punteros de archivo que son en realidad punteros que contienen descriptores de archivos y otra información sobre el archivo abierto.

Cuestiones relacionadas