> 6526924 kernel syscall Dis setrlimit(2)/getrlimit(2) should support
> RLIMIT_LOCKS, *_MEMLOCK and *_PTHREAD
Out of curiosity, I did a truss on a not-too-old ksh93 binary (s+), and saw the
following while
doing a ulimit -a:
[address space limit]
25539/1: getrlimit(RLIMIT_VMEM, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[core file size]
25539/1: getrlimit(RLIMIT_CORE, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[cpu time]
25539/1: getrlimit(RLIMIT_CPU, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[data size]
25539/1: getrlimit(RLIMIT_DATA, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[file size]
25539/1: getrlimit(RLIMIT_FSIZE, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[nofile]
25539/1: getrlimit(RLIMIT_NOFILE, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = 256 max = 65536
25539/1: sysconfig(_CONFIG_CHILD_MAX) = 29995
[pipe buffer size]
25539/1: pathconf("/", _PC_PIPE_BUF) = 5120
[?]
25539/1: getrlimit(RLIMIT_CPU, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
[socket buffer size?]
25539/1: pathconf("/", _PC_PIPE_BUF) = 5120
[stack size]
25539/1: getrlimit(RLIMIT_STACK, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = 8388608 max = RLIM64_INFINITY
[process size]
25539/1: getrlimit(RLIMIT_VMEM, 0xFFFFFFFF7FFFD0B8) = 0
25539/1: cur = RLIM64_INFINITY max = RLIM64_INFINITY
Which is to say, as that binary does things, the address space and process size
limits look to be one
and the same on Solaris, as do the pipe buffer size and socket buffer size (and
AFAIK, pipe buffer
size is _not_ settable, unlike some OSs). On another trace, I saw something
reasonable for
the nproc limit (sysconfig(_CONFIG_CHILD_MAX)), although again, that's clearly
not going to
be something the individual process can set even a soft limit for.
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.
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)
This message posted from opensolaris.org