Creeper.c

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Creeper.c
Hi,

bei mir wird mit der Referenzimplementierung und dem Pfad: /usr/share/doc reguläre Dateien angezeigt…
aber bei meiner Implementierung, funktioniert es mit diesem Pfad nicht.

ich benutze dafür:
if(S_ISREG(blabla.st_mode)){

um eine reguläre Datei zu bestimmen…

kann es sein, dass die Referenzimplementierung einfach alle Dateien anzeigt, außer man frägt explizit nach einer -d?

Weil in meinem eigenen Verzeichnis, klappt alles super

nur mit diesem Pfad halt nicht, nur Directories werden bei mir richtig angezeigt

  • in der Referenzimplementierung wird bei mir, wenn ich keine Optionen angebe, “.” ausgegeben, aber nicht “…”, sollte es so sein?

Jemand eine Idee, woran es liegen könnte?


Du musst [m]lstat()[/m] den kompletten Pfad übergeben, also Verzeichnisname + Dateiname. Wenn du nur den Dateinamen übergibst, funktioniert dein Programm nur für das aktuelle Arbeitsverzeichnis und nur nicht-rekursiv.

Verständnisfrage: Warum ist das so? :slight_smile:


Hi Airhardt,

bin so froh, dass du mir schreibst, bin schon etwas am verzweifeln xD

Okay, ich habe den Aufruf mit: stat() statt lstat() ausgeführt,
im Internet finde ich dazu:

  • das check ich nicht…was man mit dem Unterschied meint…

zu der Verstädnisfrage:
ich kriege einen Pfad übergeben, d.h. ich würde an dieser Stelle erstmal dieses „doc“ analysieren,
ist es ein File? Ist es eine Directory?

wenn es eine Directory, und die Optionen passen, dann schaue ich eine Ebene tiefer, angenommen es schaut so aus:
examples test.txt

dann wäre das nächste was ich tun würde:
/usr/share/doc/examples

examples - File oder Directory? Oder nix davon? Usw.

also wenn man nur den Dateieinamen angeben würde, wäre alles schön und gut, wenn man rekursiv aufruft, würde es nix mehr bringen…

ich hätte eine Frage zu „.“ und „…“, bei der Referenzimplementierung, wird „.“ angegeben, wenn ich keine Option angebe, und „…“ nicht,
gehen wir davon aus, mein Pfad ist „.“, ich habe keine Optionen, musste dann die Ausgabe ./. sein? Warum wird „…“ nicht ausgegeben?

Danke


Hi @Airhardt,

danke, beim zweiten Mal lesen, hab ich verstanden, was los ist…ich habe wieder nur den “Namen” geprüft, nicht aber den Pfad übergeben, man muss nur gescheit hineinlangen, dann klappt es auch :slight_smile:

Aber dennoch besteht bei mir die Frage offen, wie es mit “…” und “.” mit der Ausgabe sich da verhält, aber da werde ich mich einfach an der Referenzimplementierung orientieren,
und auch der Unterschied zwischen stat, lstat wäre noch nice

Grüße


Hups, ich hab mich leicht vertan: Das Zusammenbauen des Pfads muss man natürlich vor dem Rekursionsschritt machen und nicht vor dem [m]lstat()[/m]-Aufruf.

Wenn du [m]stat()[/m] auf einen Symlink aufrufst, dann läuft es dem Verweis hinterher und liefert dir die Attribute des Ziels. (Falls es sich bei dem Ziel wieder um einen Symlink handelt, läuft es dem ebenfalls hinterher, und so weiter.)
Wenn du [m]lstat()[/m] auf einen Symlink aufrufst, dann läuft es dem Verweis nicht hinterher, sondern liefert dir die Attribute des Symlinks selbst.

Dass die Referenzimplementierung implizit [m].[/m] durchsucht, wenn man ihm keine Pfade als Argumente mitgibt, ist in der Aufgabenstellung nicht spezifiziert und damit strikt optional.


[quote=Airhardt]
Wenn du [m]stat()[/m] auf einen Symlink aufrufst, dann läuft es dem Verweis hinterher und liefert dir die Attribute des Ziels. (Falls es sich bei dem Ziel wieder um einen Symlink handelt, läuft es dem ebenfalls hinterher, und so weiter.)[/quote]
Hm, was passiert eigentlich bei zirkulären Symlinks? <_<


Linux steigt einfach bis zu einer Tiefe von 40 rekursiv ab und kommt dann mit [m]ELOOP[/m] zurück. Eine echte Zyklenerkennung existiert nicht.


Das Betriebssystem zaehlt mit und hoert nach ueblicherweise 255 Symlinks auf weiteren zu folgen. Das begrenzt auch die Gesamtlaenge von Symlinkketten, die nicht-zirkulaer sind.


Danke,

ihr seid die besten,
war schon am Verzweifeln :smiley:
Aber dieser Hinweis, hat mir nochmal eine neue Denkweise gegeben,
schade dass es in SP nicht so ein “Testcase” gibt wie in AUD, bei der die Abgabe noch auf “Fehler” geprüft wird.


[quote=Schaumkuesschen]schade dass es in SP nicht so ein “Testcase” gibt wie in AUD, bei der die Abgabe noch auf “Fehler” geprüft wird.
[/quote]
Zu diversen Aufgaben gibt es Testcases von Studenten für Studenten hier im Forum. Die Aufgabe “creeper” gab es aber z. B. damals bei uns nicht mit dem Namen, sondern hieß “crawl”. Es kann dann natürlich sein, dass die alten Test Cases angepasst werden müssten.


Hi Marcel[Inf],

okay, gut zu wissen :slight_smile:

Danke, würde ungemein helfen…


Bau dir selber Tests und stelle sie zur Verfügung :slight_smile:


@kissen,

wäre froh, wenn ich die Aufgaben halbwegs hinbekommen kann xD
Bin dafür nicht gut genug :rolleyes:


Selbstgebaute Testcases helfen dabei die Aufgabe >= halbwegs hinzubekommen, dabei müssen diese Testcases nicht die Form von Unittests haben, sondern können sich beschränken auf “starte das Programm mit folgendem Randfall”. Dafür ist es notwendig sich über etwaige Randfälle Gedanken zu machen, was aber ohnehin eine gute Idee ist.