Warum verursacht glibcs fclose (NULL) einen Segmentierungsfehler, anstatt einen Fehler zurückzugeben?
Laut Manpagefclose(3)
:
RÜCKGABEWERT
Nach erfolgreichem Abschluss wird 0 zurückgegeben. Andernfalls,EOF
wird zurückgegeben und die globale Variableerrno
wird gesetzt, um den Fehler anzuzeigen. In beiden Fällen jeder weitere Zugriff (einschließlich eines weiteren Anrufs anfclose()
) zum Stream führt zu undefiniertem Verhalten.
FEHLER
EBADF
Der zugrunde liegende Dateideskriptorfp
ist ungültig.
Dasfclose()
Funktion kann auch fehlschlagen und eingestellt werdenerrno
für einen der für die Routinen angegebenen Fehlerclose(2)
, write(2)
oderfflush(3)
.
Na sicherfclose(NULL)
sollte scheitern aber ich erwarte, dass es mit einem zurückkommterrno
normalerweise anstatt durch Segmentierungsfehler direkt zu sterben. Gibt es einen Grund für dieses Verhalten?
Danke im Voraus.
UPDATE: Ich werde meinen Code hier einfügen (ich versuche esstrerror()
, insbesondere).
FILE *not_exist = NULL;
not_exist = fopen("nonexist", "r");
if(not_exist == NULL){
printError(errno);
}
if(fclose(not_exist) == EOF){
printError(errno);
}