Itt a C rovat. Lassan kimerülök a témákból. Lehet, hogy ez lesz az utolsó szám. Na de most nézzünk valamit ami még nem volt.

A C és az environment kapcsolata

Először is mi az az environment.

Nos ez a UNIX újítása volt. Egyszerű forításban környezetet jelent. Tulajdonképpen változók halmaza, amik a gép működésére nézve fontos információkat tartlmaznak.Ilyen például a PATH, a PROMPT, a TEMP, stb. Persze ezt a dolgot már az MS-DOS is örökölte (ponotsabban lemásolta).

A memóriában ASCIIZ (C típusú string) formátumban vannak eltárolva.

Assembly alak:

db 'NEV=ERTEK',0

A név általában csupa nagy betű, de ez nincs sehol szabályozva.

Az igazi environmentet csak olyan programok tudják elérni, amik nem child-ként futnak. Tehát nem más program által elindítva. A child-ok csak egy másolatot kapnak az environmentről, és ebben hiába változtatnak meg értékeket, az igazi environment-re nem lesz hatással. Ezért nem működik például nc alól a path, vagy a set parancs. (hogy a dn alól miért igen, azt én sem értem)

Hogy működik a dolog C-ben:

A C induláskor kapásból átmásolja magának az environment-et, így aztán bármilyen változtatás csak a mi programunk által lesz látható, az igazihoz nem tudunk hozzá férni.

Az environmentet kezelő függvének:

char *getenv(char *valtozonev);

Ez a függvény az environment változó nevét kéri be paraméterként, és az értékére mutató pointert ad vissza. Ha nincs ilyen nevű, akkor a visszaadott érték NULL.

int putenv(char * string);

Változó beillesztése, változtatása az emvironmentbe. A beillesztendo stringnek (NEV=ERTEK alakúnak kell lennie). Ha ilyen nevű változó már van, akkor csak megváltoztatja az értékét. Változót törölni is lehet:

putenv("NEV=");

Persze ennek a függvénynek nem sok értelme, van, ha az igazi environmentet akarjuk megváltoztatni, mert ott semmi sem fog látszani.

Az environment elérése:

Az egyik út az environ tömb használata. Ennek a tömbnek minden eleme egy environment változó. A tömbentk ott van vége, mikor az adott elem NULL-ra mutat. A tömb az stdlib. h-ban van deklarálva. PL:

while (environ[i]) { printf("%s",environ[i++]); } A másik út a main függvény paraméterezésében rejlik: void main(int argc, char **argv, char **env); { while (*env) {   printf("%s",*env);   env++; } }

Ekkor a main függvény megkapja az environment változók tömbjének a címét (u.a. mint az environ tömb)

Ennyi a kezelés.

PL:

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <dos.h> void main(int argc, char *argv[],char *env[]) { int i=0,exit; char envarname[80],*varvalue; do { clrscr(); printf("Az aktualis environment:\n\n"); i=0; while (environ[i]) { printf("%s\n",env[i++]); } printf("\nmelyiket akarod valtoztatni?(ENTER FOR EXIT)"); gets(envarname); if (envarname[0]!=0) if ((varvalue=getenv(envarname))==0) { printf("ilyen nevu environment valtozo nem letezik\n"); getch(); } else { printf("Az aktualis erteke: %s\n",varvalue); printf("mi legyen az uj ertek?\n"); gets(varvalue); strcat(envarname,"="); strcat(envarname,varvalue); putenv(envarname); } } while (envarname[0]!=0); }

A program nem csinál mást, mint kiírja az environment értékét.

A változók átírásának nincs semmi konkrét célja, hiszen, ezek csak a másolatok, amint kilépünk a programból, a régiek fognak élni. Csak példa a putenv() használatának bemutatása.

Zárom rövid és zavaros soraimat.