Как размер стека процесса на Linux связан с pthread, ветвлением и должностным лицом

У меня есть вопрос о размере стека процесса на Linux. Этот размер стека определяется во время связи и кодируется в файле ELF?

Я записал программу, которая печатает ее размер стека pthread_attr_getstacksize(&attr, &stacksize);. И если я запускаю эту программу непосредственно от оболочки, она дает значение приблизительно 10 МБ. Но когда я exec это от потока, который принадлежит программе мультипотока, она дает значение приблизительно 2 МБ.

Таким образом, я хочу знать, какие факторы влияют на размер стека процесса, который является fork and exec- редактор от некоторого родительского процесса. И действительно ли возможно установить размер стека процесса в его родителе во время выполнения прежде fork and exec ребенок?
Заранее спасибо.

15
задан Damien 1 May 2015 в 22:00
поделиться

1 ответ

Как сказано в руководстве к pthread_create(3):

"В Linux/x86-32 размер стека по умолчанию для нового потока составляет 2 мегабайта", Если не установлен RLIMIT_STACK лимит ресурсов (ulimit -s): в этом случае, "он определяет размер стека по умолчанию для новых потоков".

Вы можете проверить этот факт, получив текущее значение RLIMIT_STACK с помощью getrlimit(2), как в следующей программе:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>

int main()
{
    /* Warning: error checking removed to keep the example small */
    pthread_attr_t attr;
    size_t stacksize;
    struct rlimit rlim;

    pthread_attr_init(&attr);
    pthread_attr_getstacksize(&attr, &stacksize);
    getrlimit(RLIMIT_STACK, &rlim);
    /* Don't know the exact type of rlim_t, but surely it will
       fit into a size_t variable. */
    printf("%zd\n", (size_t) rlim.rlim_cur);
    printf("%zd\n", stacksize);
    pthread_attr_destroy(&attr);

    return 0;
}

Вот результаты при попытке запустить ее (скомпилированную в a. out) из командной строки:

$ ulimit -s
8192
$ ./a.out 
8388608
8388608
$ ulimit -s unlimited
$ ./a.out 
-1
2097152
$ ulimit -s 4096
$ ./a.out 
4194304
4194304
20
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

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