Aumentar o tamanho da pilha no Linux com setrlimit

lendo informações sobre como aumentar o tamanho da pilha para uma aplicação c ++ compilada com o gnu, no momento da compilation, eu entendi que isso pode ser feito com o setrlimit no início do programa. No entanto, não consegui encontrar nenhum exemplo de sucesso sobre como usá-lo e em que parte do programa se aplica para obter um tamanho de pilha de 64M para um programa em C ++, alguém poderia me ajudar?

Thanlks

Normalmente, você definiria o tamanho da pilha logo no início de e, g, no início de main() , antes de chamar qualquer outra function. Normalmente, a lógica seria:

  • chame getrlimit para obter o tamanho atual da pilha
  • se tamanho atual
  • chame setrlimit para aumentar o tamanho da pilha para o tamanho requerido

Em C, que pode ser codificado assim:

 #include  #include  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; } 

Veja se o máximo de execução do tempo de execução está limitando-o:

 [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 

Observe que o tamanho da pilha, por padrão, é limitado a 10 MiB. Então, para aumentá-lo para 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 

Para ir além do limite rígido em setrlimit (no OSX é apenas 64MB por padrão), crie um novo thread usando pthreads com um tamanho de pilha de sua escolha. Aqui está um trecho 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; }