Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Frage am Rande...



Liberty
24-09-2007, 21:07
Moin!

Ich zerbreche mir schon seit ein paar Tagen den Kopf darüber, wohin eigentlich das Betriebssystem (das dürfte bei den meisten einheitlich sein, ansonsten reicht mir auch die *nix-Variante) beim Ausführen eines Kommandos die Kommandozeilenargumente packt, damit der neue Prozess auch darauf zugreifen kann. Ich brauch die Antwort für eine kleine Hausarbeit.

So vom Gefühl her würde ich sagen, die müssten auf dem Stack des Prozesses abgelegt werden, aber wo steht sowas, damit ich das nachweisen kann, dass es auch wirklich so ist.

Oder geht das irgendwie anders.

Ein etwas ratloser Liberty.

mehlvogel
25-09-2007, 08:31
Zumindest in FreeBSD scheint es so zu sein (http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/x86-command-line.html):

Auf dem Stack wird die Anzahl der Argumente gelegt und ein Pointer zu den Argumentwerten. Letztere liegen aber im vom Betriebssystem zugewiesenen Speicherbereich für das Programm (so wird das tendenziell ja auch von den Argumente der main() Funktion in C impliziert). Ich würde auch darauf tippen, dass es in den meisten Betriebssystemen genauso gehandhabt wird - einen Beweis dafür hab ich allerdings nicht.

Liberty
25-09-2007, 14:41
Moin!

Danke für die Quelle, das ist genau das, was ich gesucht habe!

So long,
Liberty

BLUESCREEN3D
25-09-2007, 16:41
Auf dem Stack wird die Anzahl der Argumente gelegt und ein Pointer zu den Argumentwerten. Letztere liegen aber im vom Betriebssystem zugewiesenen Speicherbereich für das Programm (so wird das tendenziell ja auch von den Argumente der main() Funktion in C impliziert).
Wenn man sich Mal in einem C-Programm ausgeben lässt, auf welche Adresse z.B. argv[0] zeigt und dann (während das Programm noch läuft) in /proc/<pid_des_prozesses>/maps guckt, sieht man, dass dieser Speicherbereich anscheinend auch noch zum Stack des Programmes gehört.

Das argc im Stack-Frame der main()-Funktion ist offensichtlich nur eine Kopie des in deinem Link beschriebenen argc. Auf das eigentliche argc kann man aber leicht mittels argv[-1] zugreifen - wenn es denn wirklich immer direkt vor argv[0] liegt.