2010-02-17 3 views
18

leggendo le informazioni su come aumentare le dimensioni dello stack per un'applicazione C++ compilata con gnu, al momento della compilazione, ho capito che può essere eseguito con setrlimit all'inizio del programma. Tuttavia non sono riuscito a trovare alcun esempio di successo su come usarlo e in quale parte del programma applicarlo per ottenere una dimensione dello stack 64M per un programma C++, qualcuno potrebbe aiutarmi?Aumenta le dimensioni dello stack in Linux con setrlimit

Thanlks

+0

Tentativo di impostare 'rlimit_stack' dopo [Stack Clash] (http://www.openwall.com/lists/oss-security/2017/06/19/1) Bonifiche possono derivare in caso di fallimento o problemi correlati. Vedi anche Red Hat [Issue 1463241] (https://bugzilla.redhat.com/show_bug.cgi?id=1463241) – jww

risposta

17

Normalmente si dovrebbe impostare la dimensione dello stack nella fase iniziale, e, g, all'inizio del main(), prima di chiamare qualsiasi altra funzione. Tipicamente la logica sarebbe:

  • chiamata getrlimit arrivare stack corrente
  • se dimensione corrente < stack richiesto quindi
    • chiamata setrlimit aumentare stack di dimensioni richieste

In C che potrebbe essere codificato qualcosa del tipo:

#include <sys/resource.h> 

int main (int argc, char **argv) 
{ 
    const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb 
    struct rlimit rl; 
    int result; 

    result = getrlimit(RLIMIT_STACK, &rl); 
    if (result == 0) 
    { 
     if (rl.rlim_cur < kStackSize) 
     { 
      rl.rlim_cur = kStackSize; 
      result = setrlimit(RLIMIT_STACK, &rl); 
      if (result != 0) 
      { 
       fprintf(stderr, "setrlimit returned result = %d\n", result); 
      } 
     } 
    } 

    // ... 

    return 0; 
} 
+0

grazie sai la sintassi esatta per l'impostazione di stacj su 64M con setrlimit? – asdf

+0

Ora ho aggiunto un esempio di codice C per renderlo più chiaro - vedi sopra ... –

+0

lo controllerò, grazie mille – asdf

7

vedere se il massimo di esecuzione runtime è limitarla:

[[email protected] conf]$ ulimit -all 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16114 
max locked memory  (kbytes, -l) 32 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 10240 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 16114 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

noti che la dimensione dello stack, per default, è limitato a 10 MiB. Quindi, per aumentare a 64 MiB:

[[email protected] conf]$ ulimit -s 64M 
-bash: ulimit: 64M: invalid number 
[[email protected] conf]$ ulimit -s 65536 
[[email protected] conf]$ ulimit -all 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16114 
max locked memory  (kbytes, -l) 32 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 65536 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 16114 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 
+0

sì, so che posso usare ulimit per aumentare la dimensione dello stack, ma ho bisogno di fare questo per questa applicazione concreta che è inteso per gli utenti normali che non possono usare ulimit, perché i motivi di amministrazione – asdf

4

di andare oltre il limite duro in setrlimit (su OSX il suo solo 64 MB di default), creare un nuovo thread utilizzando pthreads con uno stack di vostra scelta. Ecco un frammento C:

// Call function f with a 256MB stack. 
    static int bigstack(void *(*f)(void *), void* userdata) { 

     pthread_t thread; 
     pthread_attr_t attr; 

     // allocate a 256MB region for the stack. 
     size_t stacksize = 256*1024*1024; 
     pthread_attr_init(&attr); 
     pthread_attr_setstacksize(&attr, stacksize); 

     int rc = pthread_create(&thread, &attr, f, userdata); 
     if (rc){ 
     printf("ERROR: return code from pthread_create() is %d\n", rc); 
     return 0; 
     } 
     pthread_join(thread, NULL); 
     return 1; 

    }