GNU/Linux >> Znalost Linux >  >> Linux

Linuxové procesy – Externí prostředí, prostředí, getenv, setenv

Toto je 1. článek z nové série o procesech v Linuxu.

Tato série se zaměří na praktické aspekty procesního prostředí, procesního řízení, procesních vztahů atd.

V tomto článku budeme diskutovat o tom, jak získat a nastavit proměnné prostředí v programu C.

Linux Processes Series:část 1 (tento článek), část 2, část 3

Co je to proces?

Proces si lze představit jako instanci spuštěného programu. Nazvali jsme to ‚instance programu‘, protože pokud je stejný program spuštěn řekněme 10krát, bude existovat 10 odpovídajících procesů.

Každý proces má své vlastní jedinečné ID procesu, pomocí kterého je v systému identifikován. Kromě vlastního ID je k procesu přidruženo také ID procesu rodiče.

Funkce main()

Program „C“ vždy začíná voláním funkce main(). Toto je první funkce, která je volána při spuštění programu.

Prototyp funkce main() je :

int main(int argc, char *argv[]);

Ve výše uvedeném prototypu:

  • Návratový typ funkce main() je „int“. Je to proto, že když funkce main() skončí, program skončí. A návratový typ z main() by znamenal, zda byl program proveden správně nebo ne. V přísném smyslu říkáme, že pokud main() vrátí ‚0‘, pak byl program úspěšně proveden. Jakákoli jiná návratová hodnota znamená selhání.
  • Funkce main() přijímá dva argumenty. Jedním je počet argumentů příkazového řádku a druhým je seznam všech argumentů příkazového řádku.

Vezměme si malý příklad kódu, který vysvětluje výše zmíněné body.

#include<stdio.h>

int main(int argc, char *argv[])
{
  int count = argc;
  printf("\n The number of arguments passed is [%d] \n", count);

  int c = 0;
  while(c < count)
  {
    printf("\n The argument [%d] is : [%s]\n", c+1, argv[c]);
    c++;
  }
  return 0;
}

Výše uvedený kód C vypíše počet argumentů příkazového řádku, které mu byly předány, a také vypíše hodnotu každého argumentu.

Když je program spuštěn, zobrazí následující výstup:

$ ./main abc 1 3

The number of arguments passed is [4]

The argument [1] is : [./main]

The argument [2] is : [abc]

The argument [3] is : [1]

The argument [4] is : [3]

Programu ‚hlavní‘ jsme předali 3 argumenty, ale protokol oznámí, že obdržel 4 argumenty. Je to proto, že název programu (který používáme k jeho spuštění) je také považován za argument příkazového řádku.

Vzhledem k tomu, že výše uvedený program byl spuštěn na terminálu, je také odeslána návratová hodnota z funkce main(). Můžete použít speciální parametr bash shell $? jak je uvedeno níže, abyste zkontrolovali návratovou hodnotu (0 znamená úspěch).

$ echo $?
0
  • Vrátíme-li se k hlavní funkci, když jádro spustí program v jazyce C, ke spuštění programu se použije funkce „exec“.
  • V dalším kroku je zavolána typická spouštěcí rutina těsně před funkcí main() programu.
  • Podobně, když program ukončí provádění, je zavolána také typická ukončovací rutina.
  • Pokud se podíváme na jakýkoli spustitelný soubor, zjistíme, že specifikuje spouštěcí rutinu a adresy rutiny jako první a poslední rutinu, která má být volána.
  • Spouštěcí rutina přebírá argumenty příkazového řádku, prostředí atd. z jádra a předává je funkci main().
  • Celé toto nastavení sestávající ze spouštěcí a ukončovací rutiny provádí linker ve fázi propojení procesu kompilace.

Seznam prostředí

Do příkazového řádku systému Linux zadejte příkaz „env“ a získáte seznam párů název=hodnota. To představuje prostředí vašeho shellu. Podobně má proces také své prostředí. Existují dva způsoby, jak můžeme přistupovat k prostředí procesu:

  1. Prostřednictvím globální proměnné ‘extern char **extern
  2. Prostřednictvím třetího argumentu funkce main() ‘char *envp[]’

Pokud jde o envp[] (3. argument), můžete se zeptat, odkud se vzal třetí argument funkce main(), jak jsme si řekli dříve, že funkce main() má pouze dva argumenty.

No, historicky byl přítomen třetí argument (pole prostředí) funkce main(). Ale ISO C určuje, že funkce main() má být zapsána pouze se dvěma argumenty. Proto tento třetí argument nepoužíváme, když specifikujeme hlavní funkci. K tomuto envp[] však můžeme přistupovat uvnitř programu.

Každopádně, když se vrátíme k seznamu prostředí, následující fragment kódu určuje, jak přistupovat k prostředí z procesu:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

extern char **environ;

int main(int argc, char *argv[])
{
  int count = 0;

  printf("\n");
  while(environ[count] != NULL)
  {
    printf("[%s] :: ", environ[count]);
    count++;
  }

  char *val = getenv("USER");
  printf("\n\nCurrent value of environment variable USER is [%s]\n",val);

  if(setenv("USER","Arora",1))
  {
    printf("\n setenv() failed\n");
    return 1;
  }

  printf("\n Successfully Added a new value to existing environment variable USER\n");

  val = getenv("USER");
  printf("\nNew value of environment variable USER is [%s]\n",val);

  while(1)
  {
    sleep(2);
  }
  return 0;
}

Ve výše uvedeném kódu jsme použili globální proměnnou ‚environ‘ pro přístup ke všem proměnným prostředí. Také jsme použili dvě funkce:

  • getenv – Získá hodnotu konkrétní proměnné prostředí
  • setenv – Nastavení nové hodnoty na proměnnou prostředí

Výstup výše uvedeného programu vypadá takto:

$ ./environ

[ORBIT_SOCKETDIR=/tmp/orbit-himanshu] :: [SSH_AGENT_PID=1627] :: [TERM=xterm] ::
[SHELL=/bin/bash] :: [WINDOWID=39846040] :: [GTK_MODULES=canberra-gtk-module] ::
[USER=himanshu] :: [SSH_AUTH_SOCK=/tmp/keyring-6kpqGc/ssh] ::
..
..

Current value of environment variable USER is [himanshu]

Successfully Added a new value to existing environment variable USER

New value of environment variable USER is [Arora]

Výše uvedený výstup vytiskne celý seznam prostředí na stdout. Výše uvedený fragment kódu také použil getenv a setenv k získání proměnné prostředí USER a změnil její hodnotu.


Linux
  1. Jak zabít běžící procesy v Linuxu

  2. Zjistěte osiřelé procesy Linuxu

  3. C# v prostředí linuxu

  1. Linuxový příkaz ps

  2. Jak zjistit, zda OS Linux používá prostředí KDE nebo Gnome

  3. variabilní dostupnost prostředí v Linuxu

  1. Jak vypsat běžící procesy v Linuxu

  2. Nastavení proměnných prostředí Linuxu

  3. Jsou vlákna implementována jako procesy v Linuxu?