Aumenta el tamaño de la stack en Linux con setrlimit

leyendo información sobre cómo boost el tamaño de la stack para una aplicación de c ++ comstackda con gnu, en tiempo de comstackción, entendí que se puede hacer con un límite de seguridad al principio del progtwig. Sin embargo, no pude encontrar ningún ejemplo exitoso sobre cómo usarlo y en qué parte del progtwig aplicarlo para obtener un tamaño de stack de 64M para un progtwig de C ++. ¿Alguien podría ayudarme?

Thanlks

Normalmente establecería el tamaño de la stack desde el principio, e, g, al inicio de main() , antes de llamar a cualquier otra función. Por lo general, la lógica sería:

  • llame a getrlimit para obtener el tamaño actual de la stack
  • si el tamaño actual
  • llame al setrlimit para boost el tamaño de la stack al tamaño requerido

En C que podría ser codificado algo como esto:

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

Vea si el máximo de ejecución del tiempo de ejecución lo está limitando:

 [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 

Tenga en cuenta que el tamaño de stack, por defecto, está limitado a 10 MiB. Entonces boostlo a 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 más allá del límite estricto en setrlimit (en OSX es de solo 64 MB por defecto), crea un nuevo hilo usando pthreads con un tamaño de stack de tu elección. Aquí hay un fragmento 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; }