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 --


Reply via email to