Aufgabe 4 - Args an execl?

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.

aufgabe4
hi…
ich hab all meine Agrumente, die die shell einliest, in ein char*-Array (also “char **commands”) gespeichert. Jetzt sitz ich aber gerade wie der Ochs vorm Berg… Wie zumTeufel übergeb ich jetzt diese einzelnen Strings alle auf einmal der execl-Funktion?


also ich hab das mit execvp gemacht

execvp(argumente[0], argumente);

argumente[0] ist dabei die auszuführende datei und argumente halt der rest… funkt bei mir wunderbar… bei execl weiss ich net wies geht…

Drager


Ich denk mal mit execl ist des net so einfach bis unmöglich, weil du da zwar beliebig viele, aber dennoch eine festgelegte Anzahl von Argumenten übergeben musst. Du weißt aber ja nicht, was da so auf deiner Shell ankommt.
Ich hab’s auch mit execvp gemacht
:finger:


Tja wieder mal einer meiner Fragen:

Ich komme einfach nicht in den Child-Prozess.

Hab ungefähr das geschrieben:

pid = fork();

if (pid > 0){
int status;
wait(&status);
}
else if (pid ==0) { …


Der child Prozess wird durch fork() erzeugt. Alles was nach fork() steht wird sowohl im parent als auch im child Prozess ausgeführt; deshalb die if Anweisungen. Im child Prozess gilt pid == 0 und somit sollte alles was in child passieren soll nach der Bedingung (pid == 0) stehen.
Sollte ich hier totalen Blödsinn erzählen, dann sagt’s mir bitte :-/

Vieleicht sollte jemand meine Antwort der Frage von Lucius hinterherverschieben


So habe ich auch gedacht aber irgendwie kommt vom Child-prozess nichts an.


Was soll “es kommt nichts an” bedeuten?


er geht nicht in den Child-prozess,
Beispiel:

Habe in den Child-Prozess ein
printf(" lalal");
gesetzt
aber es wird nie ausgegeben.


daran ist vielleicht der Buffer von stdout schuld. mach mal noch ein newline in den buffer


Wie meinen.

Ich habe keinen Buffer für stdout aungelegt.


linux/unix terminals sind zeilengebuffert und geben erst bei einem newline oder einem flush aus, was du auf drauf geschrieben hast … also printf(“blbla\n”); oder flush danach und es wird angezeigt werden :slight_smile:


Ach so! Danke für die Info, weis zwar nicht genau was ich getan habe, aber anscheinend tut er gerade was ich will :rolleyes:


Also dieses Zeugs blicke ich diesmal überhauptnicht.

der aufruf von execvp müsste doch ungefähr so aussehen

execvp(test[0],test);

wobei
test ungefähr so aussieht

test[0]=“/bin/ls”
test[1]=“ls -l”
test[2]= NULL

oder doch nicht :frowning:


fast:


Thanx endlich sehe ich etwas Licht am ende des Tunnels.