stdlib librerias libreria descargar code c stdio

c - librerias - stdio.h download



¿Está garantizado que close/fclose on stdin es correcto? (3)

Parece que las siguientes llamadas hacen lo que cabría esperar (cerrar la transmisión y no permitir ninguna entrada adicional; todo lo que espere la entrada en la transmisión devuelve un error), pero ¿está garantizado que es correcto en todos los compiladores / plataformas?

close(fileno(stdin)); fclose(stdin);


NO HAGA un cierre en 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.


No se garantiza nada correcto 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.

Como dije en la respuesta anterior, así como en mi comentario, no hay necesidad de cerrar el archivo manejador. fclose () cerrará todo correctamente para usted.


fclose(stdin) causa un uso adicional de stdin (implícito o explícito) para invocar un comportamiento indefinido, lo cual es algo muy malo . No "inhibe la entrada".

close(fileno(stdin)) hace que cualquier intento de entrada de stdin , después de que se haya agotado el búfer en uso, falle con EBADF , pero solo hasta que abra otro archivo, en cuyo caso ese archivo se convertirá en fd # 0 y cosas malas sucederá

Un enfoque más robusto podría ser:

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

con unas pocas comprobaciones de error adicionales. Esto asegurará que todas las lecturas (después de que se agote el buffer actual) provoquen errores. Si solo quiere que resulten EOF, no un error, use O_RDONLY lugar de O_WRONLY .