/* 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);
}