On Sun, 02 Dec 2007 10:11:45 PST Richard L. Hamilton wrote: > > 6526924 kernel syscall Dis setrlimit(2)/getrlimit(2) should support > > RLIMIT_LOCKS, *_MEMLOCK and *_PTHREAD
> Now, I can see _why_ the address space limit and process size limit are one > and the same: > $ grep RLIMIT_AS /usr/include/sys/resource.h > #define RLIMIT_AS RLIMIT_VMEM > but at the shell level, I wonder if it's not a little misleading to have them > both; it leaves the > impression that they can be set individually. so which one should ksh drop when RLIMIT_AS==RLIMIT_VMEM? > Perhaps it might help if the output of ulimit -a at the very least indicated > the limits that > were inherently read-only on a given platform; and in the case of limits that > were synonyms > on a particular platform (such as address space and process size on Solaris), > indicated that also. > And it's not at all clear to me what the sense of treating pipe buffer size > and socket buffer size > as the same is; maybe on some *BSD systems, pipe() is really socketpair(), > but on Solaris, real > pipe() calls result in a STREAMS based entity (onto which one can push > STREAMS modules, > use the STREAMS rather than the socketpair() method of passing file > descriptors, etc). OTOH, > I see that at least sometimes the ksh93 code maps pipe() to socketpair(); not > sure what the > heck it's doing on Solaris. Still, if it isn't mapping pipe() to > socketpair(), then by using > pathconf("/", _PC_PIPE_BUF) it's lying about the socket buffer size, and if > it is, it's lying about both. > So in addition to adding some other limits, rationalizing what ksh93 does > with the existing ones > on Solaris might not be a bad idea. (and the limit that some systems have, > RLIMIT_RSS, also > sounds rather tempting if one's going to be thinking of adding limits; I'd > think it would be > much more useful in most cases than RLIMIT_LOCKS, for example) ksh93 ulimit is driven from this const table in ksh93/data/limits.c const Limit_t shtab_limits[] = { "as", "address space limit", RLIMIT_AS, 0, 'M', LIM_KBYTE, "core", "core file size", RLIMIT_CORE, 0, 'c', LIM_BLOCK, "cpu", "cpu time", RLIMIT_CPU, 0, 't', LIM_SECOND, "data", "data size", RLIMIT_DATA, 0, 'd', LIM_KBYTE, "fsize", "file size", RLIMIT_FSIZE, 0, 'f', LIM_BLOCK, "locks", "number of file locks", RLIMIT_LOCKS, 0, 'L', LIM_COUNT, "memlock", "locked address space", RLIMIT_MEMLOCK, 0, 'l', LIM_KBYTE, "nofile", "number of open files", RLIMIT_NOFILE, "OPEN_MAX", 'n', LIM_COUNT, "nproc", "number of processes", RLIMIT_NPROC, "CHILD_MAX", 'u', LIM_COUNT, "pipe", "pipe buffer size", RLIMIT_PIPE, "PIPE_BUF", 'p', LIM_BYTE, "rss", "resident set size", RLIMIT_RSS, 0, 'm', LIM_KBYTE, "sbsize", "socket buffer size", RLIMIT_SBSIZE, "PIPE_BUF", 'b', LIM_BYTE, "stack", "stack size", RLIMIT_STACK, 0, 's', LIM_KBYTE, "threads", "number of threads", RLIMIT_PTHREAD, "THREADS_MAX", 'T', LIM_COUNT, "vmem", "process size", RLIMIT_VMEM, 0, 'v', LIM_KBYTE, { 0 } }; an iffe test defines RLIMIT_UNKNOWN and redefines any RLIMIT_* not supported on the local system to RLIMIT_UNKNOWN the only id that does not directly correspond to a RLIMIT_* is "threads" vs RLIMIT_PTHREAD the limits with string entries, e.g., "nproc" => "CHILD_MAX", defer to astconf(3) (a library interface to confstr(2) sysconf(2) pathconf(2) and getconf(1)) so it would be possible to annotate "readonly" the RLIMIT_UNKNOWN entries that defer to astconf() to add a new limit that has a corresponding RLIMIT_* or astconf() string, simply add a new table entry that will also take care of the --man/--html self- documentation and table annotations the implementation uses the table index as a bitmask so it is limited to sizeof(long)*8 entries -- Glenn Fowler -- AT&T Research, Florham Park NJ --