C > stat probleme [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

C > stat probleme [gelöst]

Beitrag von heinz » 07.11.2015 12:49:13

Hallo Zusammen,

ich habe hier einen Fehler der nur ab und zu (selten) auftritt und fuer den ich keine Erklaerung habe.
Es geht um die Feststellung, ob eine Datei existiert und eine regulaere Datei ist.

Aus dem Beispiel aus man 2 stat habe ich folgene Abfrage erstellt:

Code: Alles auswählen

bool Datei_existenz_test(char* D)// (dateiname) Gibt existiert zurueck.
{
  struct stat sb;
  if(stat(D,&sb)==-1)
  {
    printf("-->stat-Fehler->>%i\n",EXIT_FAILURE);
  }

  if((sb.st_mode&S_IFMT)==S_IFREG)
  {
    return(true);
  }
  else
  {
    return(false);
  }
}
Das Problem ist:
Ab und zu wenn ich mein Programm starte, gibt die Funktion true zurueck obwohl die Datei nicht existiert oder auch umgekehrt.
Wenn der Fehler auftritt, starte ich das Programm neu und alles ist wieder O.K.
Der Fehler tritt nur sehr selten auf und laesst sich nicht reproduzieren.
Der Dateiname wird immer korrekt uebergeben, dass habe ich schon getestet.

Hat vlt. einer von Euch eine Idee woran es liegen koennte?


Gruss heinz
Zuletzt geändert von heinz am 07.11.2015 14:04:36, insgesamt 1-mal geändert.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: C > stat probleme

Beitrag von MSfree » 07.11.2015 13:06:06

heinz hat geschrieben:if((sb.st_mode&S_IFMT)==S_IFREG)[/code]
b.st_mode&S_IFMT
führt ein bitweises AND zwischen b.st_mode und S_IFMT durch. Da S_IFMT 0x1E00 ist, kann auch das Ergebnis der AND-Operation zwischen 0 und 0x1E00 sein.

Mach aus dem IF einfach:

Code: Alles auswählen

if((sb.st_mode & S_IFREG) != 0)

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: C > stat probleme

Beitrag von heinz » 07.11.2015 13:19:11

Hallo MSfree,
Mach aus dem IF einfach:

Code: Alles auswählen

if((sb.st_mode & S_IFREG) != 0)
Dann "meint" das PGM, das jeder Dateiname existiert...

Sollte in dem Fall der Fehler nicht auch immer auftreten?

gruß heinz

owl102

Re: C > stat probleme

Beitrag von owl102 » 07.11.2015 13:20:56

Zusätzlich zur Abfrage des Flags habe ich noch zwei Punkte zu monieren:
heinz hat geschrieben:if(stat(D,&sb)==-1)
Es hat sich bewährt, immer auf "hat geklappt" bzw. "!(hat geklappt)" abzufragen, anstatt sich auf die dokumentierte Signalisierung von "hat nicht geklappt" zu verlassen. Also konkret:

Code: Alles auswählen

if ( stat(D, &sb) != 0 )
Was ist der Unterschied? Nun, die Werte außerhalb -1 und 0. Die zwar nicht kommen sollten, aber.

(In der Dokumentation steht quasi eine unsichtbare Zeile, die den Rückgabewert ungleich 0 und ungleich -1 mit "What the hell is going on here?" beschreibt.)

Code: Alles auswählen

  {
    printf("-->stat-Fehler->>%i\n",EXIT_FAILURE);
  }
Hier fehlt definitiv das "return false;". (Und das dürfte wohl das Hauptproblem sein.)

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: C > stat probleme

Beitrag von heinz » 07.11.2015 13:34:57

Hallo owl102,

danke für den Tipp! Hab es umgesetzt. Werde schauen, ob es immer noch auftritt.

In welchem Fall könnte der Rückgabewert denn ausserhalb -1 und 0 liegen?
Ich verwende ab und zu in den Dateinamen doppelpunkte und kommas, könnte es damit zu tun haben?
z.B.
bild_:0,10,0,3:.png
Um Bilderfolgen zu übergeben. (bild_000.png bis bild_010.png, Start bei 0 , 3 stellig)
Beim ersten Test übergebe ich diesen Namen an die Funktion. Wenn sie false sagt teste ich auf die Bilderfolge.

gruß heinz

owl102

Re: C > stat probleme

Beitrag von owl102 » 07.11.2015 13:47:16

heinz hat geschrieben:In welchem Fall könnte der Rückgabewert denn ausserhalb -1 und 0 liegen?
Im Falle eines geeigneten Bugs in stat() oder den Funktionen, die stat() verwendet. (Würde die Funktion stat() von einem Kollegen oder mir kommen, würde ich noch explizit auf "ungleich 0 und ungleich -1" abfragen, und eine dicke Logmeldung ausgeben, damit man merkt, daß da in stat() noch ein Bug steckt.)

Man darf beim Programmieren nicht davon ausgehen, daß das, was man verwendet, immer korrekt funktioniert. (Und man darf nicht davon ausgehen, daß das, was man selber verzapft, immer korrekt funktioniert.)

In diesem konkreten Beispiel mag das Kleinkrämerei sein. Wenn man jemanden fragt "Ist die Tür offen?", und man erwartet ein "Ja" oder "Nein", und prüft nur auf "Nein", dann wird man auch versuchen, durch die Tür zu gehen, wenn "Keine Ahnung" als Antwort kommt. Und das erlebe ich in Quelltexten ständig. Man denkt nicht immer an alle Eventualitäten, und daher ist es IMHO grundsätzlich wichtig, Abfragen so zu programmieren, daß die nicht-bedachten Eventualitäten in dem dafür geeigneteren Zweig landen.


Ansonsten: Bei den Doppelpunkten im Dateinamen sehe ich kein Problem, solange das Dateisystem nicht FATx oder NTFS ist.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: C > stat probleme

Beitrag von heinz » 07.11.2015 14:04:15

Hallo owl102,
Man darf beim Programmieren nicht davon ausgehen, daß das, was man verwendet, immer korrekt funktioniert. (Und man darf nicht davon ausgehen, daß das, was man selber verzapft, immer korrekt funktioniert.)
da hast Du natürlich recht. Allerdings suche ich bei Fehlern eigentlich immer erstmal im eigenen Code. stat ist ja nicht gerade neu...

Bis jetzt scheint es zu gehen.

Vielen Dank nochmal für die Hilfe. Auch an MSfree...

Setze erstmal auf gelöst.
Melde mich wieder, falls es nochmal auftritt.

gruß heinz

Antworten