Размер стопки увеличения в Linux с setrlimit

чтение информации о том, как увеличить размер стека для приложения C++, скомпилировало с гну во время компиляции, я понял, что это может быть сделано с setrlimit в начале программы. Тем не менее, я не мог найти успешный пример о том, как использовать его и в которой части программы применяют его для получения 64M, складывают размер для программы C++, кто-либо мог помочь мне?

Thanlks

20
задан asdf 17 February 2010 в 07:44
поделиться

2 ответа

Обычно вы устанавливаете размер стека на ранней стадии, например, g, в начале main () , прежде чем вызывать любой другой функции. Обычно логика следующая:

  • вызов getrlimit для получения текущего размера стека
  • , если текущий размер <требуемого размера стека, то
    • вызов setrlimit для увеличения размера стека до требуемого размера

В C это может быть закодировано примерно так:

#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;
}
19
ответ дан 30 November 2019 в 00:22
поделиться

Проверьте, не ограничивает ли максимум выполнения:

[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

Обратите внимание, что размер стека по умолчанию ограничен 10 MiB. Чтобы увеличить его до 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
10
ответ дан 30 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: