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.
Kérdezzetek, írjatok, miről kéne írnom.
Én már kifogytam.