2008-11-13 17 views
5

Parece que las siguientes llamadas hacen lo que cabría esperar (cierre la transmisión y no permita ninguna entrada adicional; todo lo que espere la entrada de la ruta devuelve error), pero ¿se garantiza que sea correcto en todos los compiladores/plataformas?¿Está CERRADO/FCLOSE en stdin se garantiza que es correcto?

close(fileno(stdin)); 
fclose(stdin); 
+1

puede simplemente cerrar (stdin), llamará a close() en el identificador de archivo. –

Respuesta

3

No se garantiza nada en todos los sistemas operativos posibles. Sin embargo, llamar a fclose (stdin) funcionará en cualquier sistema operativo que cumpla con POSIX, así como en los sistemas operativos Windows, por lo que debe usar casi cualquier cosa de uso general en este momento.

Según lo indicado por la respuesta anterior, así como mi comentario, no hay necesidad de llamar acercarse en el identificador del archivo. fclose() cerrará todo correctamente para usted.

14

NO HAGA un cierre en el fileno (FILE *). FILE es un objeto de almacenamiento en búfer. Examinar su implementación y entrometerse en su estado conlleva todas las advertencias y peligros que conlleva una mala conducta similar en cualquier otro módulo de software.

No lo hagas.

AGH. Seriamente. Asqueroso.

+5

De hecho, hacer close() antes de que fclose() garantice que fclose() falle si hay datos pendientes para descargar. (En un caso más general, donde podría haber otro código entre close() y fclose(), fclose() podría simplemente escribir en el archivo equivocado!) –

+0

Esto ... no ... técnicamente responde la pregunta . –

+0

Esto hace: El comportamiento del código del OP no estaría definido. Es poco probable que su implementación de fclose detecte que el fd ha sido cerrado. Si tenía otras cosas entre las llamadas para cerrar y cerrar, entonces hay otra posibilidad desagradable: después de haber cerrado un descriptor de archivo, la próxima llamada a abrir() es muy probable, en la práctica, reutilizar ese descriptor de archivo. ¿Qué pasaría si llamaras cerca del descriptor subyacente, abrieras otro descriptor con el mismo índice, y luego llamaras a fclose? El fd de la última apertura() sería ciertamente malo, al menos. – Sniggerfardimungus

17

fclose(stdin) hace que cualquier uso adicional de stdin (implícita o explícita) para invocar un comportamiento indefinido, que es una cosa muy mala . No "inhibe la entrada".

close(fileno(stdin)) hace que cualquier intento de entrada de stdin, después de que el buffer actual se ha agotado, al fallar con EBADF, pero sólo hasta que se abra otro archivo, en cuyo caso ese archivo se convertirá en fd # 0 y cosas malas pasar.

Un enfoque más robusto podría ser:

int fd = open("/dev/null", O_WRONLY); 
dup2(fd, 0); 
close(fd); 

con algunas comprobaciones de errores añadido. Esto asegurará que todas las lecturas (después de que se agote el buffer actual) provoquen errores. Si solo desea que produzcan EOF, no un error, use O_RDONLY en lugar de O_WRONLY.

Cuestiones relacionadas