Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 May 2001 02:20:04 -0700 (PDT)
From:      Peter Pentchev <roam@orbitel.bg>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/27262: process won't be terminated after CPUTIME exceeded
Message-ID:  <200105110920.f4B9K4f54827@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/27262; it has been noted by GNATS.

From: Peter Pentchev <roam@orbitel.bg>
To: in@amalea.org
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/27262: process won't be terminated after CPUTIME exceeded
Date: Fri, 11 May 2001 12:18:53 +0300

 On Fri, May 11, 2001 at 12:00:52PM +0800, in@amalea.org wrote:
 > 
 > >Number:         27262
 > >Category:       kern
 > >Synopsis:       process won't be terminated after CPUTIME exceeded
 > >Originator:     in@amalea.org
 > >Release:        FreeBSD 5.0-CURRENT i386
 > >Organization:
 > International Amalea Organization
 > >Environment:
 > System: FreeBSD dns.amalea.org 5.0-CURRENT FreeBSD 5.0-CURRENT #0: Mon May 7 22:33:41 CST 2001 in@dns.amalea.org:/usr/obj/usr/src/sys/GENERIC i386
 > 
 > 
 > 	CPU: Pentium III/Pentium III Xeon/Celeron (733.36-MHz 686-class CPU)
 > 	FreeBSD 5.0-CURRENT i386
 > 
 > >Description:
 > 
 > process which exceeds CPUTIME limit by setrlimit()
 > will not receive signal SIGXCPU and terminate.
 
 Confirmed.
 
 The attached program's output on RELENG_4 (correct):
 
 $ time ./foo
 before: cur = 7FFFFFFFFFFFFFFF, max = 7FFFFFFFFFFFFFFF
 Setting CPU limit to cur 2, max 5..
 after: cur = 2, max = 5
 Entering loop..
 time: command terminated abnormally
         2.02 real         2.01 user         0.00 sys
 Cputime limit exceeded
 $
 
 ..and on ref5.FreeBSD.org (-current, after waiting a while and hitting ^C):
 
 $ time ./foo
 before: cur = 7FFFFFFFFFFFFFFF, max = 7FFFFFFFFFFFFFFF
 Setting CPU limit to cur 2, max 5..
 after: cur = 2, max = 5
 Entering loop..
 ^CGot signal 2
 User: (3, 799606)
 System: (0, 7850)
 3.800u 0.007s 0:06.08 62.5%     5+178k 0+0io 0pf+0w
 $
 
 Something's definitely wrong with -current's setrlimit()..
 
 G'luck,
 Peter
 
 -- 
 If this sentence didn't exist, somebody would have invented it.
 
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 
 #include <err.h>
 #include <signal.h>
 #include <stdio.h>
 
 static volatile int	sig, sigflag;
 
 static void		getlim(const char *, int);
 static void		setlim(const char *, int, quad_t, quad_t);
 static void		handler(int);
 
 static void
 getlim(const char *s, int resource) {
 	struct rlimit rlp;
 
 	if (getrlimit(resource, &rlp) < 0)
 		err(1, "getrlimit(%s)", s);
 	printf("%s: cur = %llX, max = %llX\n", s, rlp.rlim_cur, rlp.rlim_max);
 }
 
 static void
 setlim(const char *s, int resource, quad_t lcur, quad_t lmax) {
 	struct rlimit rlp;
 
 	printf("Setting %s limit to cur %llX, max %llX..\n", s, lcur, lmax);
 	rlp.rlim_cur = (quad_t) lcur;
 	rlp.rlim_max = (quad_t) lmax;
 	if (setrlimit(resource, &rlp) < 0)
 		err(1, "setrlimit(%s)", s);
 }
 
 static void
 handler(int signum __unused) {
 	sig = signum;
 	sigflag = 1;
 }
 
 static void
 showrusage(void) {
 	struct rusage ru;
 
 	if (getrusage(RUSAGE_SELF, &ru) < 0)
 		err(1, "getrusage()");
 	printf("User: (%ld, %ld)\nSystem: (%ld, %ld)\n",
 	    ru.ru_utime.tv_sec, ru.ru_utime.tv_usec,
 	    ru.ru_stime.tv_sec, ru.ru_stime.tv_usec);
 }
 
 int
 main(void) {
 
 	getlim("before", RLIMIT_CPU);
 	setlim("CPU", RLIMIT_CPU, 2, 5);
 	getlim("after", RLIMIT_CPU);
 	printf("Entering loop..\n");
 	sig = 0;
 	signal(SIGINT, handler);
 	while (!sig)
 		;
 	printf("Got signal %d\n", sig);
 	showrusage();
 	return (0);
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105110920.f4B9K4f54827>