Когда я запускаю процесс в 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)
таким же образом?