Путь: Toys/POSIX, команды версии: Ver.4 Ver.9 ulimit Комментарии в файле ulimit.c :
Исходный текст в файле ulimit.c #define FOR_ulimit #include "toys.h" GLOBALS( long P; ) // This is a linux kernel syscall added in 2.6.36 (git c022a0acad53) which // glibc only exports a wrapper prototype for if you #define _FSF_HURD_RULZE. int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit); // I'd like to sort the RLIMIT values 0-15, but mips, alpha and sparc // override the asm-generic values for 5-9, and alphabetical order is nice for // humans anyway. void ulimit_main(void) { struct rlimit rr; int i; // map and desc are in the same order as flags. // The Linux kernel implementation of RLIMIT_LOCKS (-x) was removed in 2003. char *flags="cdefilmnpqRrstuv"; char map[] = {RLIMIT_CORE, RLIMIT_DATA, RLIMIT_NICE, RLIMIT_FSIZE, RLIMIT_SIGPENDING, RLIMIT_MEMLOCK, RLIMIT_RSS, RLIMIT_NOFILE, 0, RLIMIT_MSGQUEUE, RLIMIT_RTTIME, RLIMIT_RTPRIO, RLIMIT_STACK, RLIMIT_CPU, RLIMIT_NPROC, RLIMIT_AS}; char *desc[]={"core dump size (blocks)", "data size (KiB)", "max nice", "file size (blocks)", "pending signals", "locked memory (KiB)", "RSS (KiB)", "open files", "pipe size (512 bytes)", "message queues", "RT time (us)", "RT priority", "stack (KiB)", "cpu time (s)", "processes", "address space (KiB)"}; if (!(toys.optflags&(FLAG_H-1))) toys.optflags |= FLAG_f; if ((FLAG(a)||FLAG(p)) && toys.optc) error_exit("can't set -ap"); // Fetch data if (!FLAG(P)) TT.P = getppid(); for (i=0; i<sizeof(map); i++) { int get = toys.optflags&(FLAG_a|(1<<i)); if (get && prlimit(TT.P, map[i], 0, &rr)) perror_exit("-%c", flags[i]); if (!toys.optc) { if (FLAG(a)) printf("-%c: %-25s ", flags[i], desc[i]); if (get) { if ((1<<i)&FLAG_p) { if (FLAG(H)) xreadfile("/proc/sys/fs/pipe-max-size", toybuf, sizeof(toybuf)); else { int pp[2]; xpipe(pp); sprintf(toybuf, "%d\n", fcntl(*pp, F_GETPIPE_SZ)); } printf("%s", toybuf); } else { rlim_t rl = FLAG(H) ? rr.rlim_max : rr.rlim_cur; if (rl == RLIM_INFINITY) printf("unlimited\n"); else printf("%ld\n", (long)rl); } } } if (toys.optflags&(1<<i)) break; } if (FLAG(a)||FLAG(p)) return; if (toys.optc) { rlim_t val; if (tolower(**toys.optargs) == 'u') val = RLIM_INFINITY; else val = atolx_range(*toys.optargs, 0, LONG_MAX); if (FLAG(H)) rr.rlim_max = val; else rr.rlim_cur = val; if (prlimit(TT.P, map[i], &rr, 0)) perror_exit(0); } } |