Je me demande pourquoi décommentant cette première printf dans le programme suivant modifie son comportement ultérieur:stdio à la borne après la fermeture (STDOUT_FILENO) comportement
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
//printf("hi from C \n");
// Close underlying file descriptor:
close(STDOUT_FILENO);
if (write(STDOUT_FILENO, "Direct write\n", 13) != 13) // immediate error detected.
fprintf(stderr, "Error on write after close(STDOUT_FILENO): %s\n", strerror(errno));
// printf() calls continue fine, ferror(stdout) = 0 (but no write to terminal):
int rtn;
if ((rtn = printf("printf after close(STDOUT_FILENO)\n")) < 0 || ferror(stdout))
fprintf(stderr, "Error on printf after close(STDOUT_FILENO)\n");
fprintf(stderr, "printf returned %d\n", rtn);
// Only on fflush is error detected:
if (fflush(stdout) || ferror(stdout))
fprintf(stderr, "Error on fflush(stdout): %s\n", strerror(errno));
}
Sans cette première printf, les RTN printf suivantes 34 comme si Une erreur s'est produite même si la connexion entre le tampon utilisateur stdout et le fd sous-jacent a été fermée. Ce n'est que sur un fflush manuel (stdout) que l'erreur est renvoyée. Mais avec ce premier printf allumé, le printf suivant signale des erreurs comme je m'attendais. Bien sûr, rien n'est écrit dans le terminal (par printf) après que STDOUT_FILENO fd ait été fermé dans les deux cas.
Je sais qu'il est idiot de close(STDOUT_FILENO)
en premier lieu ici; C'est une expérience dans laquelle je suis tombé et qui pense que quelqu'un de plus compétent dans ces domaines peut voir quelque chose d'instructif dans nous.
Je suis sur Linux avec gcc.
'stdout' est dans un mauvais état lorsque vous avez fermé le descripteur sous-jacent' STDOUT_FILENO' les choses fonctionnent correctement avec 'fclose (stdout)'. –