2016-07-05 5 views
1

Ich wurde gebeten, (als Projekt) setenv() und unsetenv() in zu implementieren.Verwendung der globalen Variablen 'char ** environ' zur Implementierung von setenv() und unsetenv()

Ich mache das für eine Minishell, die ich baue. Ich weiß, dass ich auf die Umgebungsvariable direkt zugreifen kann (extern char **environ), weil ich es verwendete, um getenv() zu implementieren.

Meine Frage, wie füge ich einen Wert zu der oben angegebenen Umgebungsvariablen hinzu?

Ich brauche keinen Code nur eine Idee über wie oder Links zu Orten, die helfen könnten, kann ich nur Environ verwenden, um die Implementierungen zu tun.

Ich habe überall gesucht, nichts gefunden. Vielen Dank.

Antwort

1

Hinzufügen einer neuen Variable environ funktioniert wie folgt:

  1. Zählen Sie, wie viele Variablen die Umgebung enthält. Speichern Sie diese Nummer in n.
  2. Einen Puffer für n + 2 Zeiger auf char zuweisen.
  3. Kopieren Sie das Original environ in die neue Umgebung.
  4. Die neue Variable an das Ende anhängen.
  5. Vergessen Sie nicht, das Array mit \0 zu beenden.
  6. Setzen Sie environ auf das neue Array.
  7. Wenn Sie die vorherige environ zugeordnet haben, können Sie jetzt free es.

In Ihrem eigen Shell, können Sie Ihre eigene Buchhaltung tun, um sicherzustellen, dass Sie neue Puffer nicht für environ die ganze Zeit zuweisen müssen (zB durch eine etwas größere Array Aufteilung und halten Registerkarte, wie viele Einträge sind frei darin).

+0

Dank sehr hilfreicher Rat. – adot

0

Da Sie nicht wollen, Code (;

http://man7.org/tlpi/code/online/book/proc/setenv.c.html

können Sie sehen, dass setevn verwendet putenv intern, was wiederum verwendet __add_to_environ interne Funktion, dies zu tun Siehe Code für beide hier:

.

http://osxr.org:8080/glibc/source/stdlib/setenv.c

+0

danke, der Code ist einfach genug zu verstehen. Allerdings löst es nur eines meiner Probleme (unsetenv()), ich kann putenv() nicht verwenden, um setenv() zu erstellen. Vielen Dank. @lshayPeled – adot

+0

Sie müssen nicht, siehe '__add_to_environ' –

Verwandte Themen