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