Erhöhe die Stackgröße in Linux mit setrlimit

Lesen von Informationen darüber, wie man die Stapelgröße für eine mit Gnu kompilierte C ++ – Anwendung zum Kompilierungszeitpunkt erhöht, habe ich verstanden, dass dies zu Beginn des Programms mit setrlimit gemacht werden kann. Nichtsdestotrotz konnte ich kein erfolgreiches Beispiel finden, wie es zu benutzen ist und in welchem ​​Teil des Programms es angewendet wird, um eine 64M Stapelgröße für ein C ++ Programm zu bekommen. Könnte mir jemand helfen?

Thanks

Normalerweise würden Sie die Stapelgröße früh am Anfang von main() einstellen, zB vor dem Aufruf anderer functionen. Typischerweise wäre die Logik:

  • Rufen Sie getrlimit auf, um die aktuelle getrlimit zu erhalten
  • wenn aktuelle Größe
  • Rufen Sie setrlimit auf, um die setrlimit auf die erforderliche Größe zu erhöhen

In C könnte das etwa so lauten:

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

Prüfen Sie, ob das maximale Ausführungszeitlimit es einschränkt:

 [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 

Beachten Sie, dass die Stapelgröße standardmäßig auf 10 MiB begrenzt ist. Also um es auf 64 MiB zu erhöhen:

 [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 

Um das harte Limit von setrlimit zu erreichen (unter OSX sind es standardmäßig nur 64 MB), erstellen Sie einen neuen Thread mit Pthreads mit einer Stackgröße Ihrer Wahl. Hier ist ein C-Ausschnitt:

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