123 votes

Est-il un moyen de changer l'autre du processus de variables d'environnement?

Sur Unix, est-il possible qu'un processus peut changer l'autre des variables d'environnement (en supposant qu'ils sont tous en cours d'exécution par le même utilisateur)? Une solution générale qui serait le meilleur, mais si pas, ce qui sur le cas spécifique où l'on est un enfant de l'autre?

Edit: Comment à propos de via gdb?

161voto

Andrew Points 2578

Via gdb:

(gdb) attach process_id

(gdb) call putenv ("env_var_name=env_var_value")

(gdb) detach

C'est tout à fait un vilain hack et ne doit être fait dans le contexte d'un débogage scénario, bien sûr.

24voto

sleske Points 29978

Vous pouvez probablement le faire techniquement (voir les autres réponses), mais il ne pourrait pas vous aider.

La plupart des programmes s'attendent à ce que env vars ne peut pas être modifié à partir de l'extérieur après le démarrage, par conséquent, la plupart seront probablement juste de lire le vars ils sont intéressés au démarrage et à l'initialiser. Donc les changer par la suite ne sera pas de faire une différence, puisque le programme ne sera jamais re-lire.

Si vous avez posté cela comme un problème concret, vous devriez probablement prendre une approche différente. Si c'était juste de la curiosité: bonne question :-).

15voto

Jonathan Leffler Points 299946

Considérablement, non. Si vous avez eu suffisamment de privilèges (racine, ou à peu près) et piquer autour de /dev/kmem (la mémoire du noyau), et vous avez apporté des modifications au processus de l'environnement, et si le processus de re-fait référence à la variable d'environnement à la suite (qui est, le processus n'avait pas déjà, prendre une copie de l'env var et n'a pas été en utilisant simplement la copie), alors peut-être, si vous avez de la chance et intelligent, et le vent soufflait dans la bonne direction, et la phase de la lune était correcte, peut-être, vous pourriez obtenir quelque chose.

8voto

ADEpt Points 4405

Je pense plutôt artificiel façon de le faire, et il ne fonctionnera pas pour des processus arbitraires.

Supposons que vous écrivez votre propre bibliothèque partagée qui met en 'char *getenv'. Ensuite, vous configurez 'LD_PRELOAD" ou "LD_LIBRARY_PATH' env. vars, de sorte que vos processus sont exécutés avec votre bibliothèque partagée préchargées.

De cette façon, vous aura essentiellement un contrôle sur le code de la "getenv" la fonction. Ensuite, vous pouvez faire toutes sortes de mauvais tours. Votre "getenv" pourrait consulter externe fichier de configuration ou SHM segment pour les autres valeurs de l'env de vars. Ou vous pourriez faire une recherche regexp/remplacement sur la valeur requise. Ou ...

Je ne peux pas penser à un moyen facile de le faire pour arbitraire processus en cours d'exécution (même si vous êtes root), court de réécriture de l'éditeur de liens dynamiques (ld-linux.donc).

7voto

Davide Points 5091

Citant Jerry Coup D'Oeil:

Vous ne pouvez pas enseigner à un vieux chien de nouveaux trucs.

La seule chose que vous pouvez faire est de changer la variable d'environnement du processus enfant avant de le démarrer: il fait de la copie de la mère de l'environnement, désolé.

Voir http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm pour plus de détails.

Juste un commentaire sur la réponse au sujet de l'utilisation de /proc. Sous linux /proc est prise en charge mais, il ne fonctionne pas, vous ne peut pas changer l' /proc/${pid}/environ le fichier, même si vous êtes à la racine: il est absolument en lecture seule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X