GNU/Linux >> Znalost Linux >  >> Linux

Jaká je maximální velikost hodnoty proměnné prostředí Linux?

Nemyslím si, že v Linuxu existuje limit proměnných pro jednotlivé prostředí. Celková velikost všech proměnných prostředí dohromady je omezena na execve() čas. Další informace naleznete v části „Omezení velikosti argumentů a prostředí“.

Proces může používat setenv() nebo putenv() k rozšíření prostředí nad počáteční prostor přidělený exec.

Zde je rychlý a špinavý program, který vytvoří proměnnou prostředí o velikosti 256 MB.

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

int main(void)
{
  size_t size = 1 << 28; /* 256 MB */
  char *var;

  var = malloc(size);
  if (var == NULL) {
  perror("malloc");
  return 1;
}

  memset(var, 'X', size);
  var[size - 1] = '\0';
  var[0] = 'A';
  var[1] = '=';

  if (putenv(var) != 0) {
  perror("putenv");
  return 1;
}

  /*  Demonstrate E2BIG failure explained by paxdiablo */
  execl("/bin/true", "true", (char *)NULL);
  perror("execl");


  printf("A=%s\n", getenv("A"));

  return 0;
}

No, na mé krabici je to minimálně 4M. V tu chvíli jsem se nudil a šel pryč. Doufejme, že výstup z terminálu bude dokončen, než se v pondělí vrátím do práce :-)

export b1=A
export b2=$b1$b1
export b4=$b2$b2
export b8=$b4$b4
export b16=$b8$b8
export b32=$b16$b16
export b64=$b32$b32
export b128=$b64$b64
export b256=$b128$b128
export b512=$b256$b256
export b1k=$b512$b512
export b2k=$b1k$b1k
export b4k=$b2k$b2k
export b8k=$b4k$b4k
export b16k=$b8k$b8k
export b32k=$b16k$b16k
export b64k=$b32k$b32k
export b128k=$b64k$b64k
export b256k=$b128k$b128k
export b512k=$b256k$b256k
export b1m=$b512k$b512k
export b2m=$b1m$b1m
export b4m=$b2m$b2m
echo $b4m
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
:    :    :    :    :    :    :    :    :    :    :    :
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Pokud se obáváte, že 4M nemusí stačit pro vaši proměnnou prostředí, možná budete chtít přehodnotit, jak věci děláte.

Možná by bylo lepší vložit informace do souboru a pak použít proměnnou prostředí k odkazování na tento soubor. Viděl jsem případy, kdy, pokud je proměnná ve tvaru @/path/to/any/fspec , získá aktuální informace ze souboru path/to/any/fspec . Pokud není začíná @ , používá hodnotu samotné proměnné prostředí.

Je zajímavé, že když jsou všechny tyto proměnné nastavené, každý jednotlivý příkaz si začne stěžovat, že seznam argumentů je příliš dlouhý, takže i když vám je umožňuje nastavit, nemusí být schopen spustit programy poté, co to uděláte (protože musí předat prostředí těmto programům).


Linux
  1. Maximální hodnota ID procesu?

  2. Příklady exportních příkazů pro Linux (jak nastavit proměnné prostředí)

  3. Maximální PID v Linuxu

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

  2. Jaká je výchozí jednotka velikosti v příkazu linux ls -l

  3. variabilní dostupnost prostředí v Linuxu

  1. Co má příkaz export dělat v Linuxu?

  2. Jaký je nejlepší způsob, jak nastavit proměnnou prostředí v .bashrc?

  3. Jaká je velikost atomového zápisu na disk v mém systému?