/*	test program to check termination by soft CPU limit	*/
/*	ANSI C format	*/


#include	<stdio.h>
#include	<signal.h>
#include	<sys/time.h>
#include	<sys/resource.h>
#include	<unistd.h>


void		sigxcpu_handler(int);



int	main(void)

{
struct rlimit		limit;
int			i = 0;
struct sigaction        act, oact;


        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
        act.sa_flags = act.sa_flags | SA_RESTART;
        act.sa_handler = sigxcpu_handler;
        if (sigaction(SIGXCPU, &act, &oact) == -1)
		err_sys("can't catch SIGXCPU");	/* register signal handler */

        if (getrlimit(RLIMIT_CPU, &limit) < 0)	/* get current limits */
                err_sys("getrlimit");

	limit.rlim_cur = 20;			/* set CPU limit to 20 secs */

	if (setrlimit(RLIMIT_CPU, &limit) < 0)
		err_sys("getrlimit");		/* install CPU limit */

        if (timer(0) == -1)                     /* start timer */
                err_sys("timer");

	for(;;) i++;				/* forever loop */

	exit(0);
}






/*	CPU soft-limit exceed signal handler 	*/


void	sigxcpu_handler(int signo)

{

        if (timer(1) == -1)                     /* end timer */
                err_sys("timer");

	/* clean-up operation */

	exit(0);
}