Shell

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.

Shell
Hi,
Kann jemand mir mal helfen?

Mit strtok() kann das Programm nur ein Kommando OHNE Argument einlesen…wenn ich aber ein Kommando+Argument eingibt, dann geht er schon auf "Exitstatus"als ERROR Beschreibung.
:cry:

Danke!


sorry hab noch nit angefangen! aber wenn ich das tue werd ich mich nomma melden…


Mit so einer ungenauen Beschreibung kann dir wohl keiner genau sagen, wo dein Problem bzw. dessen Loesung liegt.

Aber vielleicht hilft dir eine Erklaerung wie strtok arbeitet an dem Beispiel, wenn der benutzter der shell "ls -l /home" eingegeben hat.
Beim ersten Aufruf musst du den Pointer auf den string mit angeben.
Was strtok macht ist den ersten delimiter (also hier ein Leerzeichen auf ‘\ 0’ zu setzten (also den string veraender und zerschneiden), sich intern die naechste Position merken und den Pointer auf den Anfang wieder zurueckzuliefern.

      interner Pointer
      V 
"ls" "-l /home"

Wenn man nun strtok nochmal aufruft mit NULL als Argument, dann wird der interne Pointer benutzt um das naechste Argument zu bekommen. Der string wird also weiter zerlegt.

          interner Pointer
          V 
"ls" "-l" "/home"

Dies geht so lang weiter, bis das Ende des urspruegnlichen Strings erreicht ist, dann liefert strtok NULL zurueck, so dass der Aufrufer erkennt, dass keine Argumente mehr kommen.

Warum jetzt in der manpage steht, dass man den nicht benutzten sollte ist aus dem Grund, dass dieser Befehl eben diesen Pointer, der er bekommt, oder besser gesagt den Speicher auf den er zeigt ‘zerlegt’ bzw. halt '\ 0’en da reinschreibt. Falls man den noch braucht muss man ihn also kopieren und auf dem kopierten den strtok loslassen.


Ich gebs auf, zu versuchen den ascii Wert 0 darzustellen, das mit den backslashes und der 0 dahinter ist halt der ascii Wert 0, der am Ende eines strings steht um diesen abzuschliesen.

re
du meinst, der hier, bloß für Strings? :gun:


hab mir eh nen eigenes strtok geschrieben, war für mich die bessere alternative :slight_smile:


Nachdem ich jetzt fast 50 Ecken von meinem Quadrat weggeschlagen hab funzt das auch sehr gut - die manpage von Rad zu lesen ist eh nur was fuer Leute, die es selber net gescheit koennen!

Naja bissl uebertrieben ist das schon, schlieslich ist das ja kei Zauberei was der strtok da macht und dass man selber ein gewisses Verstaendnis entwickelt und das selbst per Hand koennte ist auch nicht schlecht, aber grundsaetzlich ist es recht sinnvoll, bevor man selbst sehr viel Arbeit in die Loesung eines Problems steckt, mal zu gucken, ob das nicht schon jemand sehr gut geloest hat. (damit ist nicht abschreiben gemeint :slight_smile: )


sehr viel arbeit kann man das wohl nicht nennen und da ich noch einiges mit formatierung der strings machen wollte, hab ich halt gleich alles in einem in eine funktion gepackt. Klar geht strtok, aber es gibt doch fast für alles schon vorgeschriebene funktionen :> wo bleibt da der spass :slight_smile:


ähm wie funzt eigentlich das sos1_wait ?
wann terminiert sich das selber?
wie kann man da nen core dump erzwingen?

und wir haben nach dem loginnamen nen zeilenumbruch, bekommt man den irgendwie weg, oder muss man sich den loginnamen anders besorgen?


@Morgoth: einfach mal das LF (\n) weglassen… :wink:


Was ist denn nu Referenz? max_sh oder die Aufgabenstellung, da weder max_sh noch min_sh der Aufgabenstellung (welche die üblichen Tippfehler hat) entspricht.
Explizit: sollen wir nur den Befehl, den Befehl mit Parametern oder die gesammte Eingabe ausgeben?


orientiere Dich an der Aufgabenstellung… die Binaries in proj sollen lediglich eine Vorstellung von dem vermitteln was rauskommen soll.


Folglich: Wir sollen den Befehl ohne Pfad aber mit Parametern angeben. Naja gut, dann muss ich halt noch eine Funktion mehr schreiben…


ohne pfad? naja ich weiss nicht, ich geb die line einfach so wieder aus wie ich sie gelesen hab (wie die bsp. mini_sh).
da die angabe ja eh nicht so exact (fehlerfrei) ist (für “ls-l” gibt’s bestimmt nicht die ausgabe aufm blatt :)), denk ich mal dass des aber eh nicht wirklich relevant ist.


…aber ./ wird weggelassen. Ich geb im Moment nur den Name ohne Pfad und Parameter aus. Ist eigentlich auch recht überflüssig - immerhin hat man grade alles eingegeben. Leider fehlt halt noch ein wenig Erfahrung worauf es Punktabzug gibt… Immerhin ist ja explizit angegeben, dass man Username und dann ein Doppelpunkt ausgeben muss was ja nicht so wirklich die Herausfordereung ist.


gebt das Kommando einfach so aus, wie ihr es eingelesen habt. Das tut’s.
Es geht ja bei der Aufgabe nicht darum einzelne Zeichen aus strings
wegzufummeln.
Ich nehme mal an das fehlende ./ in der Aufgabenstellung beim sos1_wait
war eher ein Tippfehler (wawi???).


Wie immer bei solchen Fragen, hilft es die Birne einzuschalten und eher danach zu fragen, wozu sowas gut ist, anstatt ueber Differenzen in Beispiellsg und Aufgabenstellung zu sinnieren. Die Ausgabe ist fuer den Benutzer der Shell, dass er dem Rueckgabewert ein Kommando zuordnen kann.
Falls an der Aufgabenstellung was unklar ist, am besten hier im Forum direkt nachfragen, dann wissen alle bescheid (macht ihr ja eh schon).
Der Tippfehler liegt wohl in dem Aufruf “ls-l” bei dem vor das “-l” natuerlich ein Leerzeichen gehoert. Ansonsten wuerde nach der Datei “ls-l” gesucht, anstatt nach “ls” zu suchen und dem dann “-l” als Kommando zu uebergeben.
Kommandos muessen uebrigens dann mit “./foobar” aufgerufen werden, wenn “./” nicht in der Pfadvariable vorkommt.Aus Sicherheitsgruenden wird das aktuelle Verzeichnis manchmal aus dem Pfad herausgenommen.

Punktabzug gibts uebrigens eher auf wirkliche Fehler und auch “unschoene” Sachen, wie nichtfreigegebenen Speicher, fehlende oder falsche Fehlerbehandlung (z.B. Ausgaben nicht auf stderr), globale Variablen …

PS: Beim zerlegen der Kommandozeile auf das “\n” am Ende aufpassen, das gehoert weder zum letzten Argument, noch darf das ein eigenes Argument werden.


Birne einschalten ist schön und gut, aber ich hab mich schon mit so vielen (vorallem Produktionstechnnik-Korrektoren (MB-Fach)) über Sinn und Unsinn unterhalten. Aber evtl ist das bei euch Informatikern ja besser…
Sinn oder nicht. Ich fass das hier mal als “Machts wie ihr wollt, hauptsache das Programm taucht irgendwie auf.” auf


Auch auf die gefahr hin das das schonmal gesagt wurde:

Welcher username soll nun im Prompt stehen der des Programmierers oder der des aktuellen Users?