getrlimit -1 возвращаемое значение

При создании различных тестов я часто стремлюсь к максимальной задержке. Как вы все знаете, доступ к памяти в куче намного дороже, чем в стеке. Сейчас 2021 год, и когда я пробую ulimit -s, я вижу, что у меня доступно 8192 кб / с. Разве не могло быть выше?

Мне было интересно, как установить его с помощью кода c, и я нашел setrlimit и getrlimit:

Системные вызовы getrlimit () и setrlimit () получают и устанавливают ограничения ресурсов соответственно. Каждый ресурс имеет связанные мягкие и жесткие ограничения, как определено структурой rlimit [...]

Я нашел этот ответ и это one, и, хотя они оба очень интересны, я все же не понимаю некоторых мелочей:

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>
#include <errno.h>

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc, char *argv[])
{
    struct rlimit old, new;
    struct rlimit *newp;
    pid_t pid;

    if (!(argc == 2 || argc == 4)) {
        fprintf(stderr, "Usage: %s <pid> [<new-soft-limit> "
        "<new-hard-limit>]\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid = atoi(argv[1]); /* PID of target process */

    newp = NULL;
    if (argc == 4) {
        new.rlim_cur = atoi(argv[2]);
        new.rlim_max = atoi(argv[3]);
     //   newp = &new; // I comment this line to avoid messing up with the processes too much;)
    }

/* Set CPU time limit of target process; retrieve and display previous limit */

    if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
        errExit("prlimit-1");

      ;
    printf("Previous limits: soft=%lld; hard=%lld\n", (long long) old.rlim_cur, (long long) old.rlim_max);

/* Retrieve and display new CPU time limit */

    if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
        errExit("prlimit-2");
    printf("New limits: soft=%lld; hard=%lld\n", (long long) old.rlim_cur, (long long) old.rlim_max);

    //perror("error:");
    exit(EXIT_FAILURE);
}

Если я попробую выполнить какой-либо процесс, я увижу, по крайней мере, в Ubuntu 18.04 и при компиляции с помощью gcc, когда он попытается получить текущие и максимальные пределы, он вернет -1. Что именно представляет собой возвращаемое значение -1? Означает ли это, что установлено системное значение по умолчанию или не удалось получить, и если не удалось получить, в чем была причина? Почему if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1) не запускается?

Previous limits: soft=-1; hard=-1

Однако, если я раскомментирую newp = &new; (прокомментировал специально), тогда я могу установить новое значение для процесса, как текущее, так и максимальное, с этим нет проблем, и это довольно удивительно. Какое максимальное значение я мог бы теоретически установить? Я пробовал использовать sudo gcc raise_stack.c && ./a.out 9194 8192 16384, но слишком боюсь сжечь свой процессор, чтобы попробовать это сам;)

New limits: soft=8192; hard=16384

Заранее большое спасибо за то, что помог мне лучше понять getrlimit.

NB: избегайте увеличения памяти стека, если вы делаете что-то не так. Это не вопрос мнения.

изменить: не могу понять, где установить errno, чтобы получить правильный результат

error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
Previous limits: soft=-1; hard=-1
error:: Success
New limits: soft=-1; hard=-1
error:: Success

Я установил это после

long long a = prlimit(pid, RLIMIT_CPU, newp, &old);
perror("error:");

но все же не тот ERRNO, который я ищу.


person Antonin GAVREL    schedule 04.03.2021    source источник
comment
Что именно представляет собой возвращаемое значение -1. Прочтите руководство. В Linux обычная практика - возвращать 0 при успешном выполнении и ненулевое значение при ошибке. Затем устанавливается errno для указания более точного кода ошибки. В случае ошибки вызовите perror, чтобы получить строковое описание значения errno.   -  person kaylum    schedule 04.03.2021
comment
это то, что я сделал (как вы можете видеть, это прокомментировано), и я получил error: success, так что я действительно не понимаю   -  person Antonin GAVREL    schedule 04.03.2021
comment
Не могли бы вы предоставить точные данные о вводе и выводе?   -  person kaylum    schedule 04.03.2021
comment
@kaylum, спасибо, что нашли время помочь! смотри мое редактирование   -  person Antonin GAVREL    schedule 04.03.2021
comment
//perror("error:"); Я не понимаю, почему вы звоните perror в это место. На этом этапе нет ошибок, которые нужно проверить. perror должен вызываться сразу после сбойной функции. В этом случае printf был последним вызовом, и он, вероятно, привел к успеху errno.   -  person kaylum    schedule 04.03.2021
comment
да, я понял это и начал перемещать его повсюду в функции, как безмозглый цыпленок, но без каких-либо результатов зондирования ...   -  person Antonin GAVREL    schedule 04.03.2021


Ответы (1)


Значение -1 - это RLIM_INFINITY, что означает отсутствие ограничений.

person Kevin Thibedeau    schedule 20.03.2021