Почему Process.getrlimit завершается ошибкой для процесса, открытого с помощью IO.popen, но getrlimit (2) в C работает? - PullRequest
0 голосов
/ 20 февраля 2020

Когда я запускаю процесс в ruby и пытаюсь получить ограничения его ресурсов, происходит сбой:

io = IO.popen("/usr/bin/cat")
puts Process.getrlimit(io.pid)

это выдает

-:2:in `getrlimit': Invalid argument - getrlimit (Errno::EINVAL)

Это работает для Process.getrlimit(1), возврат [18446744073709551615, 18446744073709551615].

Когда я пытаюсь выполнить тот же системный вызов getrlimit(2) в C, он работает!

Я изменил Ruby, чтобы вывести pid и продолжить работу:

io = IO.popen("/usr/bin/cat")
puts io.pid
while 1; end

Затем запустил его в фоновом режиме с помощью ruby cat.rb &, использовал ps, чтобы получить его pid, я могу получить ограничения ресурсов с помощью системного вызова в C:

#include <sys/resource.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  int pid = 8657; # from the cat.rb program output
  struct rlimit rlim;
  getrlimit(pid, &rlim);
  printf("Soft limit: %d, ", rlim.rlim_cur);
  printf("Hard limit: %d\n", rlim.rlim_max);
  return 0;
}

Компиляция и запуск этого работает, почему ruby не позволяет мне делать системный вызов getrlimit(2) таким же образом?

1 Ответ

1 голос
/ 20 февраля 2020

Первый аргумент C системного вызова getrlimit - , а не pid. Вместо этого это целое число, указывающее ресурс , например RLIMIT_CPU или RLIMIT_MSGQUEUE. Если в качестве первого аргумента указать любой случайный pid, то системный вызов C , скорее всего, завершится ошибкой , вернув -1 и установив errno в EINVAL. getrlimit всегда возвращает значения для только для текущего процесса .

Чтобы получить ограничения произвольного процесса на Linux, вам необходимо использовать непереносимый prlimit системный вызов. Этот вызов не поддерживается обычным Ruby и не может быть выполнен в Unix системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...