Augmentation de la taille de la pile sous Linux avec setrlimit

lisant des informations sur la façon d'augmenter la taille de la pile pour une application c++ compilée avec gnu, au moment de la compilation, j'ai compris que cela pouvait être fait avec setrlimit au début du programme. Néanmoins, je n'ai pu trouver aucun exemple réussi sur la façon de l'utiliser et dans quelle partie du programme l'appliquer afin d'obtenir une taille de pile de 64M pour un programme c++, quelqu'un pourrait-il m'aider?

Thanlks

19
demandé sur asdf 2010-02-17 10:44:39

3 réponses

normalement, vous définissez la taille de la pile tôt,e, g , Au début de main() , avant d'appeler toute autre fonction. Typiquement la logique serait:

  • appel getrlimit pour obtenir de l'actuel taille de la pile
  • si la taille actuelle est inférieure à la taille requise de la pile, alors
    • appel setrlimit pour augmenter la taille de la pile à la taille nécessaire

en C qui pourrait être codé quelque chose comme ceci:

#include <sys/resource.h>
#include <stdio.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;
}
17
répondu Paul R 2018-04-29 23:15:51

Voir si le moteur d'exécution d'exécution maximum est de les limiter:

[wally@zf 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

notez que la taille de la pile, par défaut, est limitée à 10 MiB. Ainsi l'augmenter à 64 MiB:

[wally@zf conf]$ ulimit -s 64M
-bash: ulimit: 64M: invalid number
[wally@zf conf]$ ulimit -s 65536
[wally@zf 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
8
répondu wallyk 2010-02-17 07:54:14

pour aller au-delà de la limite de dur dans setrlimit (sur OSX son seulement 64MB par défaut), créez un nouveau thread en utilisant pthreads avec une taille de pile de votre choix. Voici un extrait de 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;

    }
4
répondu Taylor 2012-02-14 17:06:40