Vra

Op Unix, is daar geen manier dat 'n mens proses 'n ander se omgewing veranderlikes (as hulle is almal word gelei deur dieselfde gebruiker) kan verander? 'N Algemene oplossing sou die beste wees, maar indien nie, wat van die spesifieke geval waar 'n mens is 'n kind van die ander?

Edit:? Hoe gaan dit via gdb

Was dit nuttig?

Oplossing

Via gdb:

(gdb) attach process_id

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

(gdb) detach

Dit is nogal 'n nare hack en moet slegs gedoen word in die konteks van 'n debugging scenario, natuurlik.

Ander wenke

Jy het waarskynlik kan dit tegnies doen (sien ander antwoorde), maar dit kan jou nie help nie.

Die meeste programme sal verwag dat env VARs nie verander kan word van buite af na die begin, vandaar die meeste sal waarskynlik net lees die VARs hulle belangstel in by die begin en inisialiseer gebaseer op dit. So verander hulle daarna sal 'n verskil maak nie, aangesien die program sal nooit weer lees nie.

As jy dit as 'n konkrete probleem gepos, jy moet waarskynlik 'n ander benadering te neem. As dit was net uit nuuskierigheid: Nice vraag: -.)

Byna, no. As jy genoeg voorregte (wortel, of daar) het en steek rondom / dev / kmem (kern geheue), en jy veranderinge aan die omgewing die proses se gemaak, en daarna as die proses eintlik weer gekla die veranderlike omgewing (dit wil sê, die proses het 'n afskrif van die env var nie reeds geneem en is nie die gebruik van net dat afskrif), dan miskien, as jy gelukkig is en slim, en die wind waai in die regte rigting, en die fase van die maan korrek was, miskien, jy dalk iets te bereik.

Aanhaling Jerry Peek:

  

Jy kan nie leer 'n ou hond nuwe truuks.

Die enigste ding wat jy kan doen is om die omgewing veranderlike van die kind proses verander voor begin dit:. Dit raak die afskrif van die ouer omgewing, jammer

http://www.unix.com.ua/orelly /unix/upt/ch06_02.htm vir meer inligting.

Net 'n opmerking oor die antwoord oor die gebruik van / proc. Onder Linux / proc ondersteun, maar dit werk nie, jy kan nie verander die /proc/${pid}/environ lêer, selfs al is jy wortel. Dit is absoluut read-only

waaraan ek kon dink die eerder slinks manier om dit te doen, en dit sal nie werk nie vir arbitrêre prosesse.

Gestel jy skryf jou eie gedeelde biblioteek wat 'char * getenv' implemente. Dan stel jy 'LD_PRELOAD' of 'LD_BIBLIOTEEK_PAD' env. Vars sodat beide jou prosesse uit te voer met jou gedeelde biblioteek preloaded.

Op hierdie manier, sal jy in wese 'n beheer oor die kode van die funksie 'getenv. Dan kan jy allerhande nare truuks te doen. Jou 'getenv' kon eksterne opstelling lêer of SHM segment raadpleeg vir alternatiewe waardes van env VARs. Of jy kan regexp search doen / vervang op die versoek waardes. Of ...

Ek kan nie dink aan 'n maklike manier om dit te doen vir arbitrêre hardloop prosesse (selfs al is jy wortel), kort van herskryf dinamiese linkerkant (ld-linux.so).

Of kry jou proses om 'n config lêer vir die nuwe proses en dan werk óf:

  • uit te voer 'n slag -HUP op die nuwe proses om die updated opstelling lêer herlees, of
  • die proses gaan die opstelling lêer vir updates elke nou en dan. As veranderinge gevind word, herlees dan die opstelling lêer.

Nie sover ek weet. Regtig jy probeer uit een proses na 'n ander, wat doen 'n beroep vir een van die IPC metodes (gedeelde geheue, semafore, voetstukke, ens) te kommunikeer. Ontvang data deur een van hierdie metodes wat jy kan dan gestel omgewing veranderlikes of meer direk uit te voer ander aksies.

As u unix ondersteun die / processed lêerstelsel, dan is dit triviaal om die env LEES - jy kan die omgewing, instruksies te lees, en baie ander eienskappe van 'n proses wat jy besit op die manier. Om dit te verander ... Wel, ek kan dink aan 'n manier, maar dit is 'n slegte idee nie.

Die meer algemene geval ... Ek weet nie, maar ek twyfel of daar is 'n draagbare antwoord.

(Edited: my oorspronklike antwoord aanvaar die OP wou die env LEES, dit nie verander)

UNIX is vol Inter-proses kommunikasie. Kyk of jou teiken byvoorbeeld het 'n paar. Dbus steeds 'n standaard in "lessenaar" IPC.

Ek verander omgewing veranderlikes binne awesome venster bestuurder gebruik van ontsagwekkende-kliënt met 'n DBUS "sender" van Lua-kode.

Nie 'n direkte antwoord, maar ... Raymond Chen het 'n [Windows-gebaseerde] rasionaal rondom hierdie net die ander dag : -

  

... Alhoewel daar sekerlik nie ondersteun word maniere om dit te doen of 'n manier wat werk met die hulp van 'n debugger, daar is niks wat ondersteun word vir programmatiese toegang tot 'n ander proses se command line, ten minste niks wat deur die kern. ...

     

Dit is daar nie 'n gevolg van die beginsel van nie die dop van inligting wat jy nodig het nie. Die kern het nie nodig om die command line van 'n ander proses te verkry. Dit neem die command line geslaag om die CreateProcess funksie en kopieer dit na die adres spasie van die proses van stapel gestuur, in 'n plek waar die GetCommandLine funksie kan haal. Sodra die proses kan toegang tot sy eie command line, is die verantwoordelikheid van die kern se gedoen.

     

Sedert die command line in adresruimte die proses se gekopieer, die proses kan selfs skryf aan die geheue dat die command line hou en verander dit. As dit gebeur, dan is die oorspronklike command line is vir ewig verlore; die enigste bekende kopie het oorskryf.

Met ander woorde, sou so 'n kern fasiliteite wees

  • moeilik om te implementeer
  • potensieel 'n sekuriteit kommer

Maar die mees waarskynlike rede hiervoor is eenvoudig dat daar 'n beperkte gebruik gevalle vir so 'n fasiliteit.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top