При создании различных тестов я часто стремлюсь к максимальной задержке. Как вы все знаете, доступ к памяти в куче намного дороже, чем в стеке. Сейчас 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, который я ищу.
errno
для указания более точного кода ошибки. В случае ошибки вызовитеperror
, чтобы получить строковое описание значенияerrno
. - person kaylum   schedule 04.03.2021error: success
, так что я действительно не понимаю - person Antonin GAVREL   schedule 04.03.2021//perror("error:");
Я не понимаю, почему вы звонитеperror
в это место. На этом этапе нет ошибок, которые нужно проверить.perror
должен вызываться сразу после сбойной функции. В этом случаеprintf
был последним вызовом, и он, вероятно, привел к успехуerrno
. - person kaylum   schedule 04.03.2021