LINUX.ORG.RU

История изменений

Исправление Moisha_Liberman, (текущая версия) :

Вроде были какие то опции компиляции задающие размер стека?

При линковке. Например, так:

gcc -Wl,--stack,9437184 -o you_app you_app.c

Пожалуйста, стек в 9 Mb. Можно и через LD_FLAGS определить, но да, это крайне плохое решение.

Про getrlimit() тут, как я погляжу, уже написали, можно в приложении выставить свой размер стека принудительно. Примерно так (man setrlimit()):

#include <sys/resource.h>

int main (int argc, char **argv)
{
    const rlim_t my_size = 9 * 1024 * 1024;   /* Те же 9Mb */
    struct rlimit rl;
    int result;

    result = getrlimit(RLIMIT_STACK, &rl);
    if (result == 0)
    {
        if (rl.rlim_cur < my_size)
        {
            rl.rlim_cur = my_size;
            result = setrlimit(RLIMIT_STACK, &rl);
            if (result != 0)
            {
                fprintf(stderr, "Error! setrlimit() returned result = %d\n", result);
            }
        }
    }
    /* Do something here. */
    return 0;
}

Т.е., прямо в main() предупредили систему что Ваша приблуда работает со стеком в 9Mb и дальше просто используйте ф-ю alloca(), забыв о malloc/calloc/new и т.д. и т.п. Выставлять каждый раз заново размер стека не получится, тут нужно сразу прикинуть сколько по максимуму памяти может понадобиться. И, если на пролезет в стек, то просить у системы память под непролазящую в стек порцию данных. Т.е., высегда смотреть на размер приходящих данных – юольше 9M или меньше и, если > 9, то тогда calloc/malloc, всё как обычно.

Дополнительный профит здесь – вызов alloca() не требует очистки памяти по free(). Т.е., получили память в своей ф-ии, вышли из неё, считайте за Вами прибрано. Но и вернуть такой массив из своей ф-ии запросто не получится. А так, в принципе, этот вариант чуть быстрее и чуть экономичнее стандартного выделения памяти в куче, но и несколько менее надёжный.

В общем, тоже вариант так себе.

Исходная версия Moisha_Liberman, :

При линковке.

Вроде были какие то опции компиляции задающие размер стека?

При линковке. Например, так:

gcc -Wl,--stack,9437184 -o you_app you_app.c

Пожалуйста, стек в 9 Mb. Можно и через LD_FLAGS определить, но да, это крайне плохое решение.

Про getrlimit() тут, как я погляжу, уже написали, можно в приложении выставить свой размер стека принудительно. Примерно так (man setrlimit()):

#include <sys/resource.h>

int main (int argc, char **argv)
{
    const rlim_t my_size = 9 * 1024 * 1024;   /* Те же 9Mb */
    struct rlimit rl;
    int result;

    result = getrlimit(RLIMIT_STACK, &rl);
    if (result == 0)
    {
        if (rl.rlim_cur < my_size)
        {
            rl.rlim_cur = my_size;
            result = setrlimit(RLIMIT_STACK, &rl);
            if (result != 0)
            {
                fprintf(stderr, "Error! setrlimit() returned result = %d\n", result);
            }
        }
    }
    /* Do something here. */
    return 0;
}

Т.е., прямо в main() предупредили систему что Ваша приблуда работает со стеком в 9Mb и дальше просто используйте ф-ю alloca(), забыв о malloc/calloc/new и т.д. и т.п. Дополнительный профит здесь – вызов alloca() не требует очистки памяти по free(). Т.е., получили память в своей ф-ии, вышли из неё, считайте за Вами прибрано. Но и вернуть такой массив из своей ф-ии запросто не получится.

В общем, тоже вариант так себе.