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.
 

 Kimmel Tamás
eMail:PC-XUser@FREEMAIL.C3.HU, Subject: "ABC"