Почему RLIMIT_STACK теряется после fork или exec в linux? - PullRequest
3 голосов
/ 01 марта 2010

В linux говорится, что rlimit процесса сохраняется без изменений после fork или exec. Но я теряю свой RLIMIT_STACK у ребенка либо после форка, либо после exec. Кто-нибудь, пожалуйста, дайте объяснение?

Вот некоторый описательный вывод моей программы.

// Родитель имеет RLIMIT_STACK, как это

RLIMIT_STACK, мягкий - 10485760, жесткий - -1

// Сразу после разветвления дочерний элемент теряет свой RLIMIT_STACK

у потомка после вилки, RLIMIT_STACK, мягкий - -1, жесткий - -1

// В дочернем, до exec, RLIMIT_STACK soft снова устанавливается на 10485760

RLIMIT_STACK установлен ОК.

У потомка после сета, RLIMIT_STACK, мягкий - 10485760, жесткий - -1 Детский пид = 3096

// После exec новый процесс снова теряет свой RLIMIT_STACK

RLIMIT_STACK получил, мягкий - -1, жесткий - -1

Заранее спасибо
Feng

1 Ответ

1 голос
/ 01 марта 2010

Кажется, это проблема (я не уверен, что это ошибка) в реализации linuxthread в libpthread.
Я написал простую программу:

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char **argv){
struct rlimit resource_limit;
if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){
    fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno));
    return 1;
}
else{
    fprintf(stderr, "In parent, RLIMIT_STACK, soft-%d, hard-%d\n",
            resource_limit.rlim_cur, resource_limit.rlim_max);
}

int child_status = 0;
pid_t pid = fork();
switch(pid){
    case 0://child
        if(getrlimit(RLIMIT_STACK, &resource_limit) != 0){
            fprintf(stderr, "Failed to get rlimit: %s\n", strerror(errno));
            return 1;
        }
        else{
            fprintf(stderr, "In child after fork, RLIMIT_STACK, soft-%d, hard-%d\n",
                    resource_limit.rlim_cur, resource_limit.rlim_max);
        }
        break;
    case -1:
        fprintf(stderr, "Fork error: %s\n", strerror(errno));
        break;
    default://parent
        waitpid(pid, &child_status, 0);
        break;
}
return 0;

}


Если эта программа скомпилирована и связана без опции -lpthread, она везде работает нормально. Но когда он связан с опцией -lpthread, происходят проводные вещи: если он запускается на машине, где он динамически связан с версией libpthread под Linux, он дает:

In parent, RLIMIT_STACK, soft-10485760, hard--1
In child after fork, RLIMIT_STACK, soft--1, hard--1

Но при запуске на машине, где он динамически связан с NPTL-версией libpthread, он дает ожидаемый результат:

In parent, RLIMIT_STACK, soft-10485760, hard--1
In child after fork, RLIMIT_STACK, soft-10485760, hard--1
...