/* * call-seq: * Process.setrlimit(resource, cur_limit, max_limit) => nil * Process.setrlimit(resource, cur_limit) => nil * * Sets the resource limit of the process. * _cur_limit_ means current (soft) limit and * _max_limit_ means maximum (hard) limit. * * If _max_limit_ is not given, _cur_limit_ is used. * * _resource_ indicates the kind of resource to limit. * The list of resources are OS dependent. * Ruby may support following resources. * * [Process::RLIMIT_CORE] core size (bytes) (SUSv3) * [Process::RLIMIT_CPU] CPU time (seconds) (SUSv3) * [Process::RLIMIT_DATA] data segment (bytes) (SUSv3) * [Process::RLIMIT_FSIZE] file size (bytes) (SUSv3) * [Process::RLIMIT_NOFILE] file descriptors (number) (SUSv3) * [Process::RLIMIT_STACK] stack size (bytes) (SUSv3) * [Process::RLIMIT_AS] total available memory (bytes) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite) * [Process::RLIMIT_MEMLOCK] total size for mlock(2) (bytes) (4.4BSD, GNU/Linux) * [Process::RLIMIT_NPROC] number of processes for the user (number) (4.4BSD, GNU/Linux) * [Process::RLIMIT_RSS] resident memory size (bytes) (4.2BSD, GNU/Linux) * [Process::RLIMIT_SBSIZE] all socket buffers (bytes) (NetBSD, FreeBSD) * * Other <code>Process::RLIMIT_???</code> constants may be defined. * * _cur_limit_ and _max_limit_ may be <code>Process::RLIM_INFINITY</code>, * which means that the resource is not limited. * They may be <code>Process::RLIM_SAVED_MAX</code> or * <code>Process::RLIM_SAVED_CUR</code> too. * See system setrlimit(2) manual for details. * */ static VALUE proc_setrlimit(int argc, VALUE *argv, VALUE obj) { #if defined(HAVE_SETRLIMIT) && defined(NUM2RLIM) VALUE resource, rlim_cur, rlim_max; struct rlimit rlim; rb_secure(2); rb_scan_args(argc, argv, "21", &resource, &rlim_cur, &rlim_max); if (rlim_max == Qnil) rlim_max = rlim_cur; rlim.rlim_cur = NUM2RLIM(rlim_cur); rlim.rlim_max = NUM2RLIM(rlim_max); if (setrlimit(NUM2INT(resource), &rlim) < 0) { rb_sys_fail("setrlimit"); } return Qnil; #else rb_notimplement(); #endif }