Aufgabe 3:Anfänger

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 3:Anfänger
wollte eigentlich in den “Aufgabe 3”- Thread schreiben, will aber in die heiße Diskussionen über Turing- Maschinen-powered shells nicht reinplatzen :slight_smile: Fragen- ich hab einen Verdacht, dass strtok nicht 100% sauber arbeitet. Außerdem, mag ich die nicht :smiley: . Darf ich selber parsen, ohne mich auf die Punkte zu verzichten?


Ich hoff’s doch sehr – mir hat die strtok auch nicht besonders gefallen, und wenn mir jemand dafür Punkte abzieht, … grrrr


Hiho,

also strtok funktioniert wunderbar.

Erst haben wir eine variable mit unseren tokens benutzt und sie
der Funktion übergeben.
sowas a la “char* terminators = {”\t “};” → das ging nicht!

Verwendet man hingegen strtok(blablabla, "\t "); (also direkt den string an strtok bergeben), gibts NULL probleme.

die warnung im man bezieht sich meines wissens nur auf die unschöne tatsache, dass man diese funktion zweimal unterschiedlich aufruft.

gruessla
matteo


[m]char* terminators = "\t ";[/m] ?


Wäre mal interessant da was von offizieller Seite zu hören?


Jap, das funktioniert prächtig.

[code]#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
char text[] = “Hallo ich bin Johannes”;
char* token;
token = strtok(text, “\t “);
while(token != 0) {
printf(”%s\n”, token);
token = strtok(NULL, "\t ");
}
return 0;
}
[/code]

Hallo ich bin Johannes

Also ich mag strtok.


mein erster ansatz bei wsort war auch mit strtok, habs dann aber doch anders gemacht :wink:


kanns sein dass sie sich bei der angabe zur manpage von exec verdruckt habn, weil es besitzt keine man 2 page. Gemeint war wohl eher die man 3 page.


Jop. die man 2 ist zu execve und die man 3 zu exec und konsorten


Ihr koennt auch einen eigenen Parser schreiben, das macht euch aber nur unnuetze Arbeit und ihr macht dem Korrektor damit wahrscheinlich auch keine grosse Freude. Ansonsten wird es deshalb aber keinen Punkteabzug geben.


mit ging es schneller, einen eigenen Parser schnell zu hacken, als strtok richtig fehlerfrei einzubauen, besonders nach wsort :slight_smile:


? Also strtok ist doch nicht evil?
Ich verstehe eure Probleme damit nicht.


evil ist es nicht, ich find die Funktion einfach nur nicht schön…


strtok ist nur evil wenn man nicht weiß was sie für Sachen macht… Wenn man damit rechnet dass sie einem den Eingabestring kaputt macht ist es kein Problem. :wink:

Bin mal auf deinen Parser gespannt. :smiley:


[quote=IceWeasel]Wenn man damit rechnet dass sie einem den Eingabestring kaputt macht ist es kein Problem. :wink:
[/quote]
Und wenn man bedenkt, dass diese Seiteneffekte alle in der manpage erklärt sind…

execv
Hey, ich haette da mal ne Frage:

Ich bekomme immer eine “Permission denied” Fehlermeldung wenn ich execv ausfuehren moechte. Woran kann das liegen?
Die Rechte der Datei (ich nehm das wsort) sind fuer mich rwx, als erstes arg uebergeb ich den Pfad und als zweites ein char** Feld in dem die argumente drin stehen.

Jemand damit schon probleme gehabt?


sieht so aus, als würdest du versuchen, eine nicht ausführbare Datei zu starten… vielleicht der erste Argument falsch? Probier mal execvp, der brauch keinen Pfad


das erste argument muss der volle pfad zum programm inklusive des programnames sein, also die ausgabe von “which ”. Dann sollte es auch mit execv gehen … probier mal “/bin/ls” anstatt “ls” bei execv.

Probleme
Wir haben auch ein paar Probleme bei der Mini Shell und hofffen hier Hilfe zu finden. Unsere Mini Shell funktioniert soweit recht gut, nur mit ein paar Bugs kaempfen wir noch:

  1. Bei der Eingabe von ungueltigen Befehlen passiert nichts, wir bekommen den Exitstatus erst, wenn wir Strg+D eingeben.

  2. Wir zerlegen die Eingabe mit strtok und speichern die einzelnen Argumente in einem Stringarray. Bei der Pruefung ob das erste Argument ‘cd’ ist, funktioniert arguments[0] == “cd” nicht, allerdings geht arguments[0][0] == ‘c’ && arguments[0][1] == ‘d’. Strlen gibt als Laenge fuer das erste Argument 2 aus.

  3. Wollen wir dem Speicher vom Array der Argumente free’n, bekommen wir einen Segmentation Fault fuer alle Argumente ausser dem Ersten und dem Letzten (das Letzte ist eh ein NULL Pointer).

  4. Wann muss man eigentlich calloc verwenden und wann malloc? Wir kopieren den Inputstring (die Befehlseingabe) in einen Outputstring mittels strcpy. Bei Speicherzuweisung fuer den Outputstring via malloc bekommen wir unter valgrind mehrere Fehler.

Wer kann uns helfen?