Aufgabe 4

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.

Aufgabe 4
Wollte mal nachfragen bei der Aufgabe 4 wenn ich da das aktuelle Arbeitsverzeichnis mit getcwd ermittel, dann brauch ich ja auch eine oberste Grenze wie lang dieser Pfad sein darf um mit getcwd das zu ermitteln oder soll ich das über eine while-Schleife laufen lassen und so lange die Länge erhöhen, bis ich nicht mehr Null bei getcwd zurückbekomme?


Ja, mit einer while-Schleife und [m]malloc()[/m]/[m]free()[/m] kannst du das machen - allerdings nur solange [m]ERANGE[/m] als [m]errno[/m] gesetzt ist.

Alternativ kannst du auch [m]pathconf()[/m] verwenden um die maximal unterstütze Pfadlänge zu erfragen und dann ein Array dieser Größe auf dem Stack anlegen; siehe [m]man 3p getcwd[/m] (im CIP falls du die POSIX Manpages nicht installiert hast), [m]malloc()[/m] brauchst du da nicht.

Da [m]PATH_MAX[/m] willkürlich ist, sollte man das nicht verwenden.

Bei einem anderen Fehler [m]perror()[/m] und abbrechen. Wobei hier kein [m]exit()[/m] gemacht werden sollte, da es ggf. nur ein temporärer Fehler ist. Bei einem Fehler musst du allerdings den Buffer mit einem String „initialisieren“, da der Zustand vom Buffer nach einem Fehler undefiniert ist (einfach was an den Anfang reinschreiben).


Danke rudis für die schnelle Antwort :slight_smile:
Noch eine Frage: Wenn ich dann eine Zeile einlese, diese aber zu lang ist, muss ich dann nur eine Warnung ausgeben oder die ganze eingelesene Zeile auch noch ausgeben? (weil das wird ja dann richtig doof mit dem einlesen der Zeile…)


Du musst nur eine Warnung ausgeben. Allerdings muss der Rest der Zeile verworfen werden, sonst wird sie beim nächsten [m]fgets()[/m] weiter gelesen (Tipp: [m]fgetc()[/m]-Schleife, Fehlerbehandlung nicht vergessen - damit wäre dann auch eine Ausgabe der langen Zeile nicht schwer).


Wieso kann ich eigentlich nicht auf das head Element von plist in clash zugreifen, auch wenn ich plist.h include? Muss ich mir nicht sonst eine eigene verkettete Liste zusätzlich anlegen, in der ich mir die pid’s der Hintergrundsprozesse speicher und die Kommandolängen?


Dafür gibts doch [m]insertElement[/m].


ja damit kann ich die Hintergrundsprozessdaten in die verkettete Liste einhängen. Wenn jetzt aber der Vaterprozess schauen will, welche Hintergrundsprozesse beendet sind, dann muss ich ja ohne die Liste zu verändern erstmal schauen, welche Prozesse als Hintergrundsprozesse gelaufen sind und jeweils dann übprüfen ob dieser schon beendet ist. Somit bringt mir hierfür doch ein insert/remove Element gar nichts…


Selbst wenn ein Hintergrundprozess beendet ist, dann gammelt der Prozess ja noch als Zombie rum. Wie sammelst du die denn ein? hint


ich hätte jetzt gesagt mit waitpid…wofür ich aber doch die prozessnummer brauch :frowning:


Man kann dem waitpid auch sagen, dass es bei einer Statusänderung eines beliebigen Kindprozesses zurückkehrt.
Das steht aber auch so in der man-page.


ah okay ich habs verstanden danke :slight_smile:
dafür hab ich noch eine Frage: bei dem Verzeichniswechsel, soll das dann ja der clashProzess ausführen, heißt doch ich erstell mir dann dabei keinen neuen Prozess oder? Und wenn ich jetzt
cd … eingeb soll es dann auch funktionieren, oder nur wenn ich wirklich einen Pfad eingeb?


Da cd auch relative Pfade verarbeiten kann, natürlich auch “…”.


Richtig.

Ein Kind kann nicht das aktuelle Verzeichnis des Vaters aendern. Das musst du also in der Shell selbst ausfuehren.


Danke!
Wenn ich die Zombies einsammeln will, dann ist irgendwie die ganze zeit head in der Liste NULL, obwohl ich überprüft und mir ausgebe lassen hab, dass ich das element richtig in die Listre hänge und die pids von dem was ich in die liste häng(und was dann das element beim ausgeben wirklich hat) und was ich rausnehmen will sind die gleichen…liegt das an der plist Implementierung oder an mir :smiley:
und bei der d: versteh ich das richtig, dass diese callback-Funktion einfach dafür da ist um die Pid und das Kommando auszugeben ?!? Oder wofür brauch ich die… wieso kann ich nicht einfach in walkList die Liste durchgehen und jeweils PID und Kommando ausgeben für was muss ich mir dann noch eine callback funktion extra schreiben … irgendwie versteh ich den sinn nicht ganz…


Die plist funktioniert, also denke ich, dass das eher an dir liegt. Wobei du nur mit den Funktionen [m]insertElement()[/m] und [m]removeElement()[/m] auf die Liste zugreifen darfst.

Richtig.

Weil die [m]plist[/m] ein eigenes Modul ist, das (vom Prinzip her) völlig unabhängig von der clash ist (und sein soll). Damit du unterschiedliche Aufgaben damit erledigen kannst, gibt es [m]walkList()[/m] um durch die aktuellen Elemente zu iterieren. Was du dann mit den Elementen tun willst, kannst du durch die Callback-Funktion steuern.


Aber diese callback Funktion muss ich mir dann selber schreiben oder?


Ja.


Hallo,

weiß einer wie ich ein statisches 2D-Array erstelle, indem nur die Anzahl der Zeilen initialisiert ist und die Anzahl der Spalten nicht?
Also so was wie: char matrix [100][];

Bloß dass es mit der leeren Klammer nicht kompiliert. Bei char *matrix[100] funktioniert es zwar, aber da wird das falsche initialisiert.

Vielen Dank im voraus


edit